forked from llvm/llvm-project
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[LinkerWrapper] Extend with usual pass options (llvm#96704)
The goal of this patch is to enable utilizing LLVM plugin passes and remarks for GPU offload code at link time. Specifically, this patch extends clang-linker-wrapper's `--offload-opt` (and consequently `-mllvm`) to accept the various LLVM pass options that tools like opt usually accept. Those options include `--passes`, `--load-pass-plugin`, and various remarks options. Unlike many other LLVM options that are inherited from linked code by clang-linker-wrapper (e.g., `-pass-remarks` is already implemented in `llvm/lib/IR/DiagnosticHandler.cpp`), these options are implemented separately as needed by each tool (e.g., opt, llc). Fortunately, this patch is able to handle most of the implementation by passing the option values to `lto::Config`. For testing plugin support, this patch uses the simple `Bye` plugin from LLVM core, but that requires several small Clang test suite config extensions.
- Loading branch information
1 parent
22a7f6d
commit 90ccf21
Showing
8 changed files
with
183 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// Check that these simple command lines for listing LLVM options are supported, | ||
// as claimed by 'clang-linker-wrapper --help'. | ||
|
||
// RUN: clang-linker-wrapper -mllvm --help 2>&1 | FileCheck %s | ||
// RUN: clang-linker-wrapper --offload-opt=--help 2>&1 | FileCheck %s | ||
|
||
// Look for a few options supported only after -mllvm and --offload-opt. | ||
// CHECK: OPTIONS: | ||
// CHECK-DAG: --passes=<string> | ||
// CHECK-DAG: --load-pass-plugin=<string> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
// Check various clang-linker-wrapper pass options after -offload-opt. | ||
|
||
// REQUIRES: llvm-plugins, llvm-examples | ||
// REQUIRES: x86-registered-target | ||
// REQUIRES: amdgpu-registered-target | ||
|
||
// Setup. | ||
// RUN: mkdir -p %t | ||
// RUN: %clang -cc1 -emit-llvm-bc -o %t/host-x86_64-unknown-linux-gnu.bc \ | ||
// RUN: -disable-O0-optnone -triple=x86_64-unknown-linux-gnu %s | ||
// RUN: %clang -cc1 -emit-llvm-bc -o %t/openmp-amdgcn-amd-amdhsa.bc \ | ||
// RUN: -disable-O0-optnone -triple=amdgcn-amd-amdhsa %s | ||
// RUN: opt %t/openmp-amdgcn-amd-amdhsa.bc -o %t/openmp-amdgcn-amd-amdhsa.bc \ | ||
// RUN: -passes=forceattrs -force-remove-attribute=f:noinline | ||
// RUN: clang-offload-packager -o %t/openmp-x86_64-unknown-linux-gnu.out \ | ||
// RUN: --image=file=%t/openmp-amdgcn-amd-amdhsa.bc,triple=amdgcn-amd-amdhsa | ||
// RUN: %clang -cc1 -S -o %t/host-x86_64-unknown-linux-gnu.s \ | ||
// RUN: -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa \ | ||
// RUN: -fembed-offload-object=%t/openmp-x86_64-unknown-linux-gnu.out \ | ||
// RUN: %t/host-x86_64-unknown-linux-gnu.bc | ||
// RUN: %clang -cc1as -o %t/host-x86_64-unknown-linux-gnu.o \ | ||
// RUN: -triple x86_64-unknown-linux-gnu -filetype obj -target-cpu x86-64 \ | ||
// RUN: %t/host-x86_64-unknown-linux-gnu.s | ||
|
||
// Check plugin, -passes, and no remarks. | ||
// RUN: clang-linker-wrapper -o a.out --embed-bitcode \ | ||
// RUN: --linker-path=/usr/bin/true %t/host-x86_64-unknown-linux-gnu.o \ | ||
// RUN: %offload-opt-loadbye --offload-opt=-wave-goodbye \ | ||
// RUN: --offload-opt=-passes="function(goodbye),module(inline)" 2>&1 | \ | ||
// RUN: FileCheck -match-full-lines -check-prefixes=OUT %s | ||
|
||
// Check plugin, -p, and remarks. | ||
// RUN: clang-linker-wrapper -o a.out --embed-bitcode \ | ||
// RUN: --linker-path=/usr/bin/true %t/host-x86_64-unknown-linux-gnu.o \ | ||
// RUN: %offload-opt-loadbye --offload-opt=-wave-goodbye \ | ||
// RUN: --offload-opt=-p="function(goodbye),module(inline)" \ | ||
// RUN: --offload-opt=-pass-remarks=inline \ | ||
// RUN: --offload-opt=-pass-remarks-output=%t/remarks.yml \ | ||
// RUN: --offload-opt=-pass-remarks-filter=inline \ | ||
// RUN: --offload-opt=-pass-remarks-format=yaml 2>&1 | \ | ||
// RUN: FileCheck -match-full-lines -check-prefixes=OUT,REM %s | ||
// RUN: FileCheck -input-file=%t/remarks.yml -match-full-lines \ | ||
// RUN: -check-prefixes=YML %s | ||
|
||
// Check handling of bad plugin. | ||
// RUN: not clang-linker-wrapper \ | ||
// RUN: --offload-opt=-load-pass-plugin=%t/nonexistent.so 2>&1 | \ | ||
// RUN: FileCheck -match-full-lines -check-prefixes=BAD-PLUGIN %s | ||
|
||
// OUT-NOT: {{.}} | ||
// OUT: Bye: f | ||
// OUT-NEXT: Bye: test | ||
// REM-NEXT: remark: {{.*}} 'f' inlined into 'test' {{.*}} | ||
// OUT-NOT: {{.}} | ||
|
||
// YML-NOT: {{.}} | ||
// YML: --- !Passed | ||
// YML-NEXT: Pass: inline | ||
// YML-NEXT: Name: Inlined | ||
// YML-NEXT: Function: test | ||
// YML-NEXT: Args: | ||
// YML: - Callee: f | ||
// YML: - Caller: test | ||
// YML: ... | ||
// YML-NOT: {{.}} | ||
|
||
// BAD-PLUGIN-NOT: {{.}} | ||
// BAD-PLUGIN: {{.*}}Could not load library {{.*}}nonexistent.so{{.*}} | ||
// BAD-PLUGIN-NOT: {{.}} | ||
|
||
void f() {} | ||
void test() { f(); } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters