1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[MC] Use COMDAT for LSDA only if IR comdat type is any

This fixed issue introduced in 16af97393346ad636298605930a8b503a55eb40a
and 796feb61637c407aefcc0d462f24a1cc41f350d8.

Differential Revision: https://reviews.llvm.org/D100909
This commit is contained in:
Petr Hosek 2021-04-20 16:14:02 -07:00
parent 16a7ccaf6b
commit 92218c28cd
2 changed files with 25 additions and 1 deletions

View File

@ -890,9 +890,11 @@ MCSection *TargetLoweringObjectFileELF::getSectionForLSDA(
unsigned Flags = LSDA->getFlags(); unsigned Flags = LSDA->getFlags();
const MCSymbolELF *LinkedToSym = nullptr; const MCSymbolELF *LinkedToSym = nullptr;
StringRef Group; StringRef Group;
bool IsComdat = false;
if (const Comdat *C = getELFComdat(&F)) { if (const Comdat *C = getELFComdat(&F)) {
Flags |= ELF::SHF_GROUP; Flags |= ELF::SHF_GROUP;
Group = C->getName(); Group = C->getName();
IsComdat = C->getSelectionKind() == Comdat::Any;
} }
// Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36 // Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36
// or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER. // or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER.
@ -908,7 +910,7 @@ MCSection *TargetLoweringObjectFileELF::getSectionForLSDA(
return getContext().getELFSection( return getContext().getELFSection(
(TM.getUniqueSectionNames() ? LSDA->getName() + "." + F.getName() (TM.getUniqueSectionNames() ? LSDA->getName() + "." + F.getName()
: LSDA->getName()), : LSDA->getName()),
LSDA->getType(), Flags, 0, Group, F.hasComdat(), MCSection::NonUniqueID, LSDA->getType(), Flags, 0, Group, IsComdat, MCSection::NonUniqueID,
LinkedToSym); LinkedToSym);
} }

View File

@ -53,6 +53,28 @@ eh.resume:
resume { i8*, i32 } %0 resume { i8*, i32 } %0
} }
;; If the function is in a comdat group with noduplicates kind, the generated
;; .gcc_except_table should is lowered to a zero-flag ELF section group.
$zero = comdat noduplicates
define i32 @zero() uwtable comdat personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
; CHECK-LABEL: zero:
; CHECK: .cfi_endproc
; NORMAL-NEXT: .section .gcc_except_table.zero,"aG",@progbits,zero{{$}}
; SEP_BFD-NEXT: .section .gcc_except_table.zero,"aG",@progbits,zero{{$}}
; SEP-NEXT: .section .gcc_except_table.zero,"aGo",@progbits,zero,zero{{$}}
; SEP_NOUNIQUE-NEXT: .section .gcc_except_table,"aG",@progbits,zero{{$}}
; NOUNIQUE-NEXT: .section .gcc_except_table,"aG",@progbits,zero{{$}}
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 void @ext()
declare i32 @__gxx_personality_v0(...) declare i32 @__gxx_personality_v0(...)