diff options
author | Sidharth Baveja <sidharth.baveja@ibm.com> | 2021-04-30 14:48:02 +0000 |
---|---|---|
committer | Sidharth Baveja <sidharth.baveja@ibm.com> | 2021-04-30 14:48:02 +0000 |
commit | 70c433a184a54819835e54c62c3e6891e7069861 (patch) | |
tree | 5d0297c2fdf8b4e5452a6f24af2904854a664d5a /llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | |
parent | fbfcfdbf6828b8d36f4ec0ff5f4eac11fb1411a5 (diff) | |
download | llvm-70c433a184a54819835e54c62c3e6891e7069861.zip llvm-70c433a184a54819835e54c62c3e6891e7069861.tar.gz llvm-70c433a184a54819835e54c62c3e6891e7069861.tar.bz2 |
[XCOFF][AIX] Add Global Variables Directly to TOC for 32 bit AIX
Summary:
This patch implements the backend implementation of adding global variables
directly to the table of contents (TOC), rather than adding the address of the
variable to the TOC.
Currently, this patch will look for the "toc-data" attribute on symbols in the
IR, and then add those symbols to the TOC.
ATM, this is implemented for 32 bit AIX.
Reviewers: sfertile
Differential Revision: https://reviews.llvm.org/D101178
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index c298172..7388ffb 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -2171,6 +2171,12 @@ TargetLoweringObjectFileXCOFF::getTargetSymbol(const GlobalValue *GV, // function entry point. We choose to always return a function descriptor // here. if (const GlobalObject *GO = dyn_cast<GlobalObject>(GV)) { + if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV)) + if (GVar->hasAttribute("toc-data")) + return cast<MCSectionXCOFF>( + SectionForGlobal(GVar, SectionKind::getData(), TM)) + ->getQualNameSymbol(); + if (GO->isDeclarationForLinker()) return cast<MCSectionXCOFF>(getSectionForExternalReference(GO, TM)) ->getQualNameSymbol(); @@ -2196,6 +2202,15 @@ MCSection *TargetLoweringObjectFileXCOFF::getExplicitSectionGlobal( report_fatal_error("#pragma clang section is not yet supported"); StringRef SectionName = GO->getSection(); + + // Handle the XCOFF::TD case first, then deal with the rest. + if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO)) + if (GVar->hasAttribute("toc-data")) + return getContext().getXCOFFSection( + SectionName, Kind, + XCOFF::CsectProperties(/*MappingClass*/ XCOFF::XMC_TD, XCOFF::XTY_SD), + /* MultiSymbolsAllowed*/ true); + XCOFF::StorageMappingClass MappingClass; if (Kind.isText()) MappingClass = XCOFF::XMC_PR; @@ -2232,6 +2247,16 @@ MCSection *TargetLoweringObjectFileXCOFF::getSectionForExternalReference( MCSection *TargetLoweringObjectFileXCOFF::SelectSectionForGlobal( const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const { + // Handle the XCOFF::TD case first, then deal with the rest. + if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO)) + if (GVar->hasAttribute("toc-data")) { + SmallString<128> Name; + getNameWithPrefix(Name, GO, TM); + return getContext().getXCOFFSection( + Name, Kind, XCOFF::CsectProperties(XCOFF::XMC_TD, XCOFF::XTY_SD), + /* MultiSymbolsAllowed*/ true); + } + // Common symbols go into a csect with matching name which will get mapped // into the .bss section. // Zero-initialized local TLS symbols go into a csect with matching name which |