Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[gold] Add preliminary FatLTO support to the Gold plugin
This changes the definition if `isSectionBitcode` to only be valid for the `.llvm.lto` section, since this API is only called from LTO, and the `.llvmbc` section was not intended to be used for LTO. This allows the gold plugin to keep its existing behavior without introducing any significant changes. Depends on D146778 Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D152973
- Loading branch information
Showing
8 changed files
with
152 additions
and
22 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 |
---|---|---|
|
@@ -2,4 +2,4 @@ | |
.asciz "Wrong Section" | ||
|
||
.section __LLVM,__bitcode | ||
.incbin "bcsection.bc" | ||
.incbin "llvm.lto.section.bc" |
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,2 @@ | ||
.section .llvm.lto | ||
.incbin "llvm.lto.section.bc" |
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,25 @@ | ||
; RUN: rm -rf %t && mkdir -p %t | ||
; RUN: llvm-as -o %t/llvm.lto.section.bc %s | ||
|
||
; RUN: llvm-mc -I=%t -filetype=obj -triple=x86_64-pc-win32 -o %t/llvm.lto.section.coff.bco %p/Inputs/llvm.lto.section.s | ||
; RUN: llvm-nm %t/llvm.lto.section.coff.bco | FileCheck %s | ||
; RUN: llvm-lto -exported-symbol=main -exported-symbol=_main -o %t/llvm.lto.section.coff.o %t/llvm.lto.section.coff.bco | ||
; RUN: llvm-nm %t/llvm.lto.section.coff.o | FileCheck %s | ||
|
||
; RUN: llvm-mc -I=%t -filetype=obj -triple=x86_64-unknown-linux-gnu -o %t/llvm.lto.section.elf.bco %p/Inputs/llvm.lto.section.s | ||
; RUN: llvm-nm %t/llvm.lto.section.elf.bco | FileCheck %s | ||
; RUN: llvm-lto -exported-symbol=main -exported-symbol=_main -o %t/llvm.lto.section.elf.o %t/llvm.lto.section.elf.bco | ||
; RUN: llvm-nm %t/llvm.lto.section.elf.o | FileCheck %s | ||
|
||
|
||
; RUN: llvm-mc -I=%t -filetype=obj -triple=x86_64-apple-darwin11 -o %t/bcsection.macho.bco %p/Inputs/bcsection.macho.s | ||
; RUN: llvm-nm %t/bcsection.macho.bco | FileCheck %s | ||
; RUN: llvm-lto -exported-symbol=main -exported-symbol=_main -o %t/bcsection.macho.o %t/bcsection.macho.bco | ||
; RUN: llvm-nm %t/bcsection.macho.o | FileCheck %s | ||
|
||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
; CHECK: main | ||
define i32 @main() { | ||
ret i32 0 | ||
} |
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,9 @@ | ||
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t | ||
# RUN: not %gold -plugin %llvmshlibdir/LLVMgold%shlibext %t -o /dev/null 2>&1 | FileCheck %s | ||
|
||
# CHECK: error:{{.*}} Invalid bitcode signature | ||
|
||
.section .llvm.lto,"e",@progbits | ||
.Lllvm.embedded.object: | ||
.asciz "BC\300\3365\000" | ||
.size .Lllvm.embedded.object, 12 |
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,108 @@ | ||
;; Basic FatLTO tests. | ||
|
||
; RUN: rm -rf %t && split-file %s %t | ||
|
||
;; Ensure that input files contain .llvm.lto section | ||
; RUN: llc %t/a-LTO.ll --filetype=obj -o %t/a-fatLTO.o | ||
; RUN: opt --module-summary %t/a-LTO.ll -o %t/a-fatLTO.bc | ||
; RUN: llvm-objcopy --add-section=.llvm.lto=%t/a-fatLTO.bc %t/a-fatLTO.o | ||
; RUN: llvm-objcopy --set-section-flags=.llvm.lto=readonly,exclude %t/a-fatLTO.o | ||
; RUN: llvm-readobj -S %t/a-fatLTO.o | FileCheck --check-prefix=CHECK-A %s | ||
|
||
; CHECK-A: Name: .llvm.lto | ||
|
||
; RUN: llc %t/main-LTO.ll --filetype=obj -o %t/main-fatLTO.o | ||
; RUN: opt --module-summary %t/main-LTO.ll -o %t/main-fatLTO.bc | ||
; RUN: llvm-objcopy --add-section=.llvm.lto=%t/main-fatLTO.bc %t/main-fatLTO.o | ||
; RUN: llvm-objcopy --set-section-flags=.llvm.lto=readonly,exclude %t/main-fatLTO.o | ||
; RUN: llvm-readobj -S %t/main-fatLTO.o | FileCheck --check-prefix=CHECK-MAIN %s | ||
|
||
; CHECK-MAIN: Name: .llvm.lto | ||
|
||
;; Final executable should not have .llvm.lto section no matter what the target is | ||
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext -o %t/foo-fatLTO %t/a-fatLTO.o %t/main-fatLTO.o | ||
; RUN: llvm-readobj -S %t/foo-fatLTO | FileCheck --check-prefix=CHECK-LTO-TARGET %s | ||
|
||
;; Check that fat objects work w/ s=--start-lib | ||
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext -o %t/foo-fatLTO.start_lib --start-lib %t/a-fatLTO.o %t/main-fatLTO.o --end-lib | ||
; RUN: llvm-readobj -S %t/foo-fatLTO.start_lib | FileCheck --check-prefix=CHECK-LTO-TARGET %s | ||
|
||
;; Check if .llvm.lto section gets aggregated in LTO target | ||
; CHECK-LTO-TARGET-NOT: Name: .llvm.lto | ||
|
||
;; Final executable should not have .llvm.lto section no matter what the target is | ||
; RUN: %gold -o %t/foo-fatNoLTO %t/a-fatLTO.o %/t/main-fatLTO.o | ||
; RUN: llvm-readobj -S %t/foo-fatNoLTO | FileCheck --check-prefix=CHECK-NON-LTO-TARGET %s | ||
|
||
;; Check if .llvm.lto section gets aggregated in non-LTO target | ||
; CHECK-NON-LTO-TARGET-NOT: Name: .llvm.lto | ||
|
||
;; Check if the LTO target executable produced from FatLTO object file is | ||
;; identical to the one produced from LTO modules | ||
; RUN: opt --module-summary %t/a-LTO.ll -o %t/a-LTO.bc | ||
; RUN: opt --module-summary %t/main-LTO.ll -o %t/main-LTO.bc | ||
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext -o %t/foo-LTO %t/a-LTO.bc %t/main-LTO.bc | ||
; RUN: cmp %t/foo-fatLTO %t/foo-LTO | ||
|
||
;; Check if the no-LTO target executable produced from FatLTO object file is | ||
;; identical to the one produced from regular object files | ||
|
||
; RUN: llc %t/a-LTO.ll --filetype=obj -o %t/a.o | ||
; RUN: llc %t/main-LTO.ll --filetype=obj -o %t/main.o | ||
|
||
; RUN: %gold -o %t/foo-noLTO %t/a.o %t/main.o | ||
; RUN: cmp %t/foo-fatNoLTO %t/foo-noLTO | ||
|
||
;; Check archive support | ||
; RUN: llvm-ar rcs %t/a.a %t/a-fatLTO.o | ||
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext -o %t/foo-fatLTO.archive %t/main-LTO.bc %t/a.a | ||
; RUN: cmp %t/foo-fatLTO.archive %t/foo-LTO | ||
|
||
;--- a-LTO.ll | ||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
; Function Attrs: noinline nounwind uwtable | ||
define dso_local i32 @_start() #0 { | ||
entry: | ||
ret i32 0 | ||
} | ||
|
||
attributes #0 = { noinline nounwind uwtable } | ||
|
||
!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6} | ||
|
||
!0 = !{i32 1, !"wchar_size", i32 4} | ||
!1 = !{i32 7, !"PIC Level", i32 2} | ||
!2 = !{i32 7, !"PIE Level", i32 2} | ||
!3 = !{i32 7, !"uwtable", i32 2} | ||
!4 = !{i32 7, !"frame-pointer", i32 2} | ||
!5 = !{i32 1, !"ThinLTO", i32 0} | ||
!6 = !{i32 1, !"EnableSplitLTOUnit", i32 1} | ||
|
||
;--- main-LTO.ll | ||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
; Function Attrs: noinline nounwind uwtable | ||
define dso_local i32 @main() #0 { | ||
entry: | ||
%retval = alloca i32, align 4 | ||
store i32 0, ptr %retval, align 4 | ||
%call = call i32 (...) @_start() | ||
ret i32 %call | ||
} | ||
|
||
declare i32 @_start(...) | ||
|
||
attributes #0 = { noinline nounwind uwtable } | ||
|
||
!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6} | ||
|
||
!0 = !{i32 1, !"wchar_size", i32 4} | ||
!1 = !{i32 7, !"PIC Level", i32 2} | ||
!2 = !{i32 7, !"PIE Level", i32 2} | ||
!3 = !{i32 7, !"uwtable", i32 2} | ||
!4 = !{i32 7, !"frame-pointer", i32 2} | ||
!5 = !{i32 1, !"ThinLTO", i32 0} | ||
!6 = !{i32 1, !"EnableSplitLTOUnit", i32 1} |
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