diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-04-22 04:11:00 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-04-22 04:11:00 +0000 |
commit | fae374b95efd9f07a7bcb9fae374c10b02b9283d (patch) | |
tree | 5643343e503dddcf70a7d2c2b1490653f13b52b5 /test | |
parent | d9443d717dbb3ec01ae8441dd70c2a077a7b5c09 (diff) |
Linker: Add flag to override linkage rules
Add a flag to lib/Linker (and `llvm-link`) to override linkage rules.
When set, the functions in the source module *always* replace those in
the destination module.
The `llvm-link` option is `-override=abc.ll`. All the "regular" modules
are loaded and linked first, followed by the `-override` modules. This
is useful for debugging workflows where some subset of the module (e.g.,
a single function) is extracted into a separate file where it's
optimized differently, before being merged back in.
Patch by Luqman Aden!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235473 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/Linker/Inputs/override-different-linkage.ll | 4 | ||||
-rw-r--r-- | test/Linker/Inputs/override-with-internal-linkage-2.ll | 4 | ||||
-rw-r--r-- | test/Linker/Inputs/override-with-internal-linkage.ll | 4 | ||||
-rw-r--r-- | test/Linker/Inputs/override.ll | 4 | ||||
-rw-r--r-- | test/Linker/override-different-linkage.ll | 19 | ||||
-rw-r--r-- | test/Linker/override-with-internal-linkage-2.ll | 23 | ||||
-rw-r--r-- | test/Linker/override-with-internal-linkage.ll | 23 | ||||
-rw-r--r-- | test/Linker/override.ll | 19 |
8 files changed, 100 insertions, 0 deletions
diff --git a/test/Linker/Inputs/override-different-linkage.ll b/test/Linker/Inputs/override-different-linkage.ll new file mode 100644 index 00000000000..bc151409180 --- /dev/null +++ b/test/Linker/Inputs/override-different-linkage.ll @@ -0,0 +1,4 @@ +define linkonce i32 @foo(i32 %i) { +entry: + ret i32 4 +} diff --git a/test/Linker/Inputs/override-with-internal-linkage-2.ll b/test/Linker/Inputs/override-with-internal-linkage-2.ll new file mode 100644 index 00000000000..2f54a1511fa --- /dev/null +++ b/test/Linker/Inputs/override-with-internal-linkage-2.ll @@ -0,0 +1,4 @@ +define internal i32 @foo(i32 %i) { +entry: + ret i32 4 +} diff --git a/test/Linker/Inputs/override-with-internal-linkage.ll b/test/Linker/Inputs/override-with-internal-linkage.ll new file mode 100644 index 00000000000..6e06fa5c4f7 --- /dev/null +++ b/test/Linker/Inputs/override-with-internal-linkage.ll @@ -0,0 +1,4 @@ +define i32 @foo(i32 %i) { +entry: + ret i32 4 +} diff --git a/test/Linker/Inputs/override.ll b/test/Linker/Inputs/override.ll new file mode 100644 index 00000000000..6e06fa5c4f7 --- /dev/null +++ b/test/Linker/Inputs/override.ll @@ -0,0 +1,4 @@ +define i32 @foo(i32 %i) { +entry: + ret i32 4 +} diff --git a/test/Linker/override-different-linkage.ll b/test/Linker/override-different-linkage.ll new file mode 100644 index 00000000000..19961f2486a --- /dev/null +++ b/test/Linker/override-different-linkage.ll @@ -0,0 +1,19 @@ +; RUN: llvm-link %s -override %S/Inputs/override-different-linkage.ll -S | FileCheck %s +; RUN: llvm-link -override %S/Inputs/override-different-linkage.ll %s -S | FileCheck %s + + +; CHECK-LABEL: define linkonce i32 @foo +; CHECK-NEXT: entry: +; CHECK-NEXT: ret i32 4 +define weak i32 @foo(i32 %i) { +entry: + %add = add nsw i32 %i, %i + ret i32 %add +} + +; Function Attrs: nounwind ssp uwtable +define i32 @main(i32 %argc, i8** %argv) { +entry: + %a = call i32 @foo(i32 2) + ret i32 %a +} diff --git a/test/Linker/override-with-internal-linkage-2.ll b/test/Linker/override-with-internal-linkage-2.ll new file mode 100644 index 00000000000..2de52a925b2 --- /dev/null +++ b/test/Linker/override-with-internal-linkage-2.ll @@ -0,0 +1,23 @@ +; RUN: llvm-link %s -override %S/Inputs/override-with-internal-linkage-2.ll -S | FileCheck %s +; RUN: llvm-link -override %S/Inputs/override-with-internal-linkage-2.ll %s -S | FileCheck %s + +; CHECK-LABEL: define i32 @foo +; CHECK-NEXT: entry: +; CHECK-NEXT: %add = add nsw i32 %i, %i +; CHECK-NEXT: ret i32 %add +define i32 @foo(i32 %i) { +entry: + %add = add nsw i32 %i, %i + ret i32 %add +} + +; CHECK-LABEL: define internal i32 @foo1 +; CHECK-NEXT: entry: +; CHECK-NEXT: ret i32 4 + +; Function Attrs: nounwind ssp uwtable +define i32 @main(i32 %argc, i8** %argv) { +entry: + %a = call i32 @foo(i32 2) + ret i32 %a +} diff --git a/test/Linker/override-with-internal-linkage.ll b/test/Linker/override-with-internal-linkage.ll new file mode 100644 index 00000000000..f1163d32174 --- /dev/null +++ b/test/Linker/override-with-internal-linkage.ll @@ -0,0 +1,23 @@ +; RUN: llvm-link %s -override %S/Inputs/override-with-internal-linkage.ll -S | FileCheck %s +; RUN: llvm-link -override %S/Inputs/override-with-internal-linkage.ll %s -S | FileCheck %s + +; CHECK-LABEL: define internal i32 @foo2 +; CHECK-NEXT: entry: +; CHECK-NEXT: %add = add nsw i32 %i, %i +; CHECK-NEXT: ret i32 %add + +; CHECK-LABEL: define i32 @foo +; CHECK-NEXT: entry: +; CHECK-NEXT: ret i32 4 +define internal i32 @foo(i32 %i) { +entry: + %add = add nsw i32 %i, %i + ret i32 %add +} + +; Function Attrs: nounwind ssp uwtable +define i32 @main(i32 %argc, i8** %argv) { +entry: + %a = call i32 @foo(i32 2) + ret i32 %a +} diff --git a/test/Linker/override.ll b/test/Linker/override.ll new file mode 100644 index 00000000000..015cb4c382a --- /dev/null +++ b/test/Linker/override.ll @@ -0,0 +1,19 @@ +; RUN: llvm-link %s -override %S/Inputs/override.ll -S | FileCheck %s +; RUN: llvm-link -override %S/Inputs/override.ll %s -S | FileCheck %s + + +; CHECK-LABEL: define i32 @foo +; CHECK-NEXT: entry: +; CHECK-NEXT: ret i32 4 +define i32 @foo(i32 %i) { +entry: + %add = add nsw i32 %i, %i + ret i32 %add +} + +; Function Attrs: nounwind ssp uwtable +define i32 @main(i32 %argc, i8** %argv) { +entry: + %a = call i32 @foo(i32 2) + ret i32 %a +} |