-
Notifications
You must be signed in to change notification settings - Fork 12.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[AsmPrinter] Split up .gcc_except_table
MC currently produces monolithic .gcc_except_table section. GCC can split up .gcc_except_table: * if comdat: `.section .gcc_except_table._Z6comdatv,"aG",@progbits,_Z6comdatv,comdat` * otherwise, if -ffunction-sections: `.section .gcc_except_table._Z3fooi,"a",@progbits` This ensures that (a) non-prevailing copies are discarded and (b) .gcc_except_table associated to discarded text sections can be discarded by a .gcc_except_table-aware linker (GNU ld, but not gold or LLD) This patches matches the GCC behavior. If -fno-unique-section-names is specified, we don't append the suffix. If -ffunction-sections is additionally specified, use `.section ...,unique`. Note, if clang driver communicates that the linker is LLD and we know it is new (11.0.0 or later) we can use SHF_LINK_ORDER to avoid string table costs, at least in the -fno-unique-section-names case. We cannot use it on GNU ld because as of binutils 2.35 it does not support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER components in an output section https://sourceware.org/bugzilla/show_bug.cgi?id=26256 For RISC-V -mrelax, this patch additionally fixes an assembler-linker interaction problem: because a section is shrinkable, the length of a call-site code range is not a constant. Relocations referencing the associated text section (STT_SECTION) are needed. However, a STB_LOCAL relocation referencing a discarded section group member from outside the group is disallowed by the ELF specification (PR46675): ``` // a.cc inline int comdat() { try { throw 1; } catch (int) { return 1; } return 0; } int main() { return comdat(); } // b.cc inline int comdat() { try { throw 1; } catch (int) { return 1; } return 0; } int foo() { return comdat(); } clang++ -target riscv64-linux -c a.cc b.cc -fPIC -mno-relax ld.lld -shared a.o b.o => ld.lld: error: relocation refers to a symbol in a discarded section: ``` -fbasic-block-sections= is similar to RISC-V -mrelax: there are outstanding relocations. Reviewed By: jrtc27, rahmanl Differential Revision: https://reviews.llvm.org/D83655
- Loading branch information
Showing
6 changed files
with
102 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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
; RUN: llc < %s -mtriple=x86_64 | FileCheck %s --check-prefixes=CHECK,NORMAL | ||
; RUN: llc < %s -mtriple=x86_64 -unique-section-names=false | FileCheck %s --check-prefixes=CHECK,NOUNIQUE | ||
; RUN: llc < %s -mtriple=x86_64 -function-sections | FileCheck %s --check-prefixes=CHECK,SEP | ||
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=false | FileCheck %s --check-prefixes=CHECK,SEP_NOUNIQUE | ||
|
||
;; Don't use `,unique` if GNU as<2.35. | ||
; RUN: llc < %s -mtriple=x86_64 -function-sections -unique-section-names=false -no-integrated-as | FileCheck %s --check-prefixes=CHECK,SEP_NOUNIQUE_GAS | ||
|
||
@_ZTIi = external constant i8* | ||
|
||
;; If the function is in a comdat group, the generated .gcc_except_table should | ||
;; be placed in the same group, so that .gcc_except_table can be discarded if | ||
;; the comdat is not prevailing. If -funique-section-names, append the function name. | ||
$group = comdat any | ||
define i32 @group() uwtable comdat personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { | ||
; CHECK-LABEL: group: | ||
; CHECK: .cfi_endproc | ||
; NORMAL-NEXT: .section .gcc_except_table.group,"aG",@progbits,group,comdat{{$}} | ||
; NOUNIQUE-NEXT: .section .gcc_except_table,"aG",@progbits,group,comdat{{$}} | ||
; SEP-NEXT: .section .gcc_except_table.group,"aG",@progbits,group,comdat{{$}} | ||
; SEP_NOUNIQUE-NEXT: .section .gcc_except_table,"aG",@progbits,group,comdat,unique,2 | ||
; SEP_NOUNIQUE_GAS-NEXT: .section .gcc_except_table,"aG",@progbits,group,comdat{{$}} | ||
entry: | ||
invoke void @ext() to label %try.cont unwind label %lpad | ||
lpad: | ||
%0 = landingpad { i8*, i32 } catch i8* bitcast (i8** @_ZTIi to i8*) | ||
br label %eh.resume | ||
try.cont: | ||
ret i32 0 | ||
eh.resume: | ||
resume { i8*, i32 } %0 | ||
} | ||
|
||
;; If the function is not in a comdat group, but function sections is enabled, | ||
;; use a separate section by either using a unique ID (integrated assembler) or | ||
;; a suffix (GNU as<2.35). | ||
define i32 @foo() uwtable personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { | ||
; CHECK-LABEL: foo: | ||
; CHECK: .cfi_endproc | ||
; NORMAL-NEXT: .section .gcc_except_table,"a",@progbits{{$}} | ||
; NOUNIQUE-NEXT: .section .gcc_except_table,"a",@progbits{{$}} | ||
; SEP-NEXT: .section .gcc_except_table.foo,"a",@progbits{{$}} | ||
; SEP_NOUNIQUE-NEXT: .section .gcc_except_table,"a",@progbits,unique,4 | ||
; SEP_NOUNIQUE_GAS-NEXT: .section .gcc_except_table,"a",@progbits{{$}} | ||
entry: | ||
invoke void @ext() to label %try.cont unwind label %lpad | ||
lpad: | ||
%0 = landingpad { i8*, i32 } catch i8* bitcast (i8** @_ZTIi to i8*) | ||
br label %eh.resume | ||
try.cont: | ||
ret i32 0 | ||
eh.resume: | ||
resume { i8*, i32 } %0 | ||
} | ||
|
||
declare void @ext() | ||
|
||
declare i32 @__gxx_personality_v0(...) |