Skip to content

[PowerPC] Move __ehinfo TOC entries to the end of the TOC section #73586

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions llvm/include/llvm/MC/MCSymbolXCOFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ namespace llvm {
class MCSectionXCOFF;

class MCSymbolXCOFF : public MCSymbol {

enum XCOFFSymbolFlags : uint16_t { SF_EHInfo = 0x0001 };

public:
MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary)
: MCSymbol(SymbolKindXCOFF, Name, isTemporary) {}
Expand Down Expand Up @@ -65,6 +68,10 @@ class MCSymbolXCOFF : public MCSymbol {
return getUnqualifiedName();
}

bool isEHInfo() const { return getFlags() & SF_EHInfo; }

void setEHInfo() const { modifyFlags(SF_EHInfo, SF_EHInfo); }

private:
std::optional<XCOFF::StorageClass> StorageClass;
MCSectionXCOFF *RepresentedCsect = nullptr;
Expand Down
16 changes: 11 additions & 5 deletions llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2310,8 +2310,10 @@ bool TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB(

MCSymbol *
TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(const MachineFunction *MF) {
return MF->getMMI().getContext().getOrCreateSymbol(
MCSymbol *EHInfoSym = MF->getMMI().getContext().getOrCreateSymbol(
"__ehinfo." + Twine(MF->getFunctionNumber()));
cast<MCSymbolXCOFF>(EHInfoSym)->setEHInfo();
return EHInfoSym;
}

MCSymbol *
Expand Down Expand Up @@ -2644,12 +2646,16 @@ MCSection *TargetLoweringObjectFileXCOFF::getSectionForFunctionDescriptor(
MCSection *TargetLoweringObjectFileXCOFF::getSectionForTOCEntry(
const MCSymbol *Sym, const TargetMachine &TM) const {
// Use TE storage-mapping class when large code model is enabled so that
// the chance of needing -bbigtoc is decreased.
// the chance of needing -bbigtoc is decreased. Also, the toc-entry for
// EH info is never referenced directly using instructions so it can be
// allocated with TE storage-mapping class.
return getContext().getXCOFFSection(
cast<MCSymbolXCOFF>(Sym)->getSymbolTableName(), SectionKind::getData(),
XCOFF::CsectProperties(
TM.getCodeModel() == CodeModel::Large ? XCOFF::XMC_TE : XCOFF::XMC_TC,
XCOFF::XTY_SD));
XCOFF::CsectProperties((TM.getCodeModel() == CodeModel::Large ||
cast<MCSymbolXCOFF>(Sym)->isEHInfo())
? XCOFF::XMC_TE
: XCOFF::XMC_TC,
XCOFF::XTY_SD));
}

MCSection *TargetLoweringObjectFileXCOFF::getSectionForLSDA(
Expand Down
13 changes: 12 additions & 1 deletion llvm/test/CodeGen/PowerPC/aix-ehinfo-sym.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
; RUN: llc -mtriple powerpc64-ibm-aix -fast-isel -verify-machineinstrs < %s | \
; RUN: FileCheck %s

; RUN: llc -mtriple powerpc64-ibm-aix -verify-machineinstrs -filetype=obj \
; RUN: -o %t.o < %s
; RUN: llvm-readobj --syms %t.o | FileCheck --check-prefix=SYM %s

; Function Attrs: nounwind
declare i32 @func1() #0

Expand Down Expand Up @@ -47,4 +51,11 @@ attributes #0 = { nounwind }
attributes #1 = { mustprogress noinline optnone }

; CHECK: __ehinfo.0:
; CHECK: .tc __ehinfo.0[TC],__ehinfo.0
; CHECK: .tc __ehinfo.0[TE],__ehinfo.0

; SYM: Symbol {
; SYM: Name: __ehinfo.0
; SYM: CSECT Auxiliary Entry {
; SYM: StorageMappingClass: XMC_TE (0x16)
; SYM: }
; SYM: }
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ entry:
; COMMON-NEXT: # -- End function
; COMMON: .toc
; COMMON: L..C2:
; COMMON-NEXT: .tc __ehinfo.1[TC],__ehinfo.1
; COMMON-NEXT: .tc __ehinfo.1[TE],__ehinfo.1


; OBJ-DIS: 9c: 00 00 00 00 # Traceback table start
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/PowerPC/aix-exception.ll
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ eh.resume: ; preds = %catch.dispatch
; ASM: L..C0:
; ASM: .tc _ZTIi[TC],_ZTIi[UA]
; ASM: L..C1:
; ASM: .tc __ehinfo.1[TC],__ehinfo.1
; ASM: .tc __ehinfo.1[TE],__ehinfo.1

declare ptr @__cxa_allocate_exception(i32)
declare void @__cxa_throw(ptr, ptr, ptr)
Expand Down