diff options
author | diggerlin <digger.llvm@gmail.com> | 2020-01-06 11:38:22 -0500 |
---|---|---|
committer | diggerlin <digger.llvm@gmail.com> | 2020-01-06 11:38:22 -0500 |
commit | 61b5e727b7ccfca7e0cbb0ed70f9e828cd1514bd (patch) | |
tree | 23aaa5bf91bd8385ddf7a4b154607ae768bef19a /llvm/lib/Target/PowerPC | |
parent | eec0240f97180ea876193dcfa3cb03cb652d9fe3 (diff) | |
download | bcm5719-llvm-61b5e727b7ccfca7e0cbb0ed70f9e828cd1514bd.tar.gz bcm5719-llvm-61b5e727b7ccfca7e0cbb0ed70f9e828cd1514bd.zip |
[AIX] Use csect reference for function address constants
SUMMARY:
We currently emit a reference for function address constants as labels;
for example:
foo_ptr:
.long foo
however, there may be no such label in the case where the function is
undefined. Although the label exists when the function is defined, we
will (to be consistent) also use a csect reference in that case.
Reviewers: daltenty,hubert.reinterpretcast,jasonliu,Xiangling_L
Subscribers: cebowleratibm, wuzish, nemanjai
Differential Revision: https://reviews.llvm.org/D71144
Diffstat (limited to 'llvm/lib/Target/PowerPC')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 1a45ad1fa9b..31fd7b2b562 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -177,6 +177,8 @@ public: void SetupMachineFunction(MachineFunction &MF) override; + const MCExpr *lowerConstant(const Constant *CV) override; + void EmitGlobalVariable(const GlobalVariable *GV) override; void EmitFunctionDescriptor() override; @@ -1763,6 +1765,26 @@ void PPCAIXAsmPrinter::ValidateGV(const GlobalVariable *GV) { report_fatal_error("COMDAT not yet supported by AIX."); } +const MCExpr *PPCAIXAsmPrinter::lowerConstant(const Constant *CV) { + if (const Function *F = dyn_cast<Function>(CV)) { + MCSymbolXCOFF *FSym = cast<MCSymbolXCOFF>(getSymbol(F)); + if (!FSym->hasContainingCsect()) { + const XCOFF::StorageClass SC = + F->isDeclaration() + ? TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(F) + : XCOFF::C_HIDEXT; + MCSectionXCOFF *Csect = OutStreamer->getContext().getXCOFFSection( + FSym->getName(), XCOFF::XMC_DS, + F->isDeclaration() ? XCOFF::XTY_ER : XCOFF::XTY_SD, SC, + SectionKind::getMetadata()); + FSym->setContainingCsect(Csect); + } + return MCSymbolRefExpr::create( + FSym->getContainingCsect()->getQualNameSymbol(), OutContext); + } + return PPCAsmPrinter::lowerConstant(CV); +} + void PPCAIXAsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { ValidateGV(GV); |