From 0bd0801218fedbe12ce0f0342fa185ff07bbd22c Mon Sep 17 00:00:00 2001 From: Xiangling Liao Date: Fri, 29 May 2020 11:41:10 -0400 Subject: [PATCH] [AIX] Emit AvailableExternally Linkage on AIX Since on AIX, our strategy is to not use -u to suppress any undefined symbols, we need to emit .extern for the symbols with AvailableExternally linkage. Differential Revision: https://reviews.llvm.org/D80642 --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 7 +++- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 8 ++-- lib/Target/PowerPC/PPCAsmPrinter.cpp | 2 +- lib/Target/TargetLoweringObjectFile.cpp | 2 +- .../aix-available-externally-linkage.ll | 39 +++++++++++++++++++ 5 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 test/CodeGen/PowerPC/aix-available-externally-linkage.ll diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 3be48935f2a..0aaf5a487c1 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -438,8 +438,13 @@ void AsmPrinter::emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const { return; } LLVM_FALLTHROUGH; - case GlobalValue::AppendingLinkage: case GlobalValue::AvailableExternallyLinkage: + if (MAI->hasDotExternDirective()) { + OutStreamer->emitSymbolAttribute(GVSym, MCSA_Extern); + return; + } + LLVM_FALLTHROUGH; + case GlobalValue::AppendingLinkage: llvm_unreachable("Should never emit this"); } llvm_unreachable("Unknown linkage type!"); diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 586de4fd97f..68df50f1a87 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -1983,7 +1983,7 @@ TargetLoweringObjectFileXCOFF::getTargetSymbol(const GlobalValue *GV, // function entry point. We choose to always return a function descriptor // here. if (const GlobalObject *GO = dyn_cast(GV)) { - if (GO->isDeclaration()) + if (GO->isDeclarationForLinker()) return cast(getSectionForExternalReference(GO, TM)) ->getQualNameSymbol(); @@ -2011,7 +2011,7 @@ MCSection *TargetLoweringObjectFileXCOFF::getExplicitSectionGlobal( MCSection *TargetLoweringObjectFileXCOFF::getSectionForExternalReference( const GlobalObject *GO, const TargetMachine &TM) const { - assert(GO->isDeclaration() && + assert(GO->isDeclarationForLinker() && "Tried to get ER section for a defined global."); SmallString<128> Name; @@ -2133,6 +2133,7 @@ XCOFF::StorageClass TargetLoweringObjectFileXCOFF::getStorageClassForGlobal( return XCOFF::C_HIDEXT; case GlobalValue::ExternalLinkage: case GlobalValue::CommonLinkage: + case GlobalValue::AvailableExternallyLinkage: return XCOFF::C_EXT; case GlobalValue::ExternalWeakLinkage: case GlobalValue::LinkOnceAnyLinkage: @@ -2143,9 +2144,6 @@ XCOFF::StorageClass TargetLoweringObjectFileXCOFF::getStorageClassForGlobal( case GlobalValue::AppendingLinkage: report_fatal_error( "There is no mapping that implements AppendingLinkage for XCOFF."); - case GlobalValue::AvailableExternallyLinkage: - report_fatal_error("unhandled AvailableExternallyLinkage when mapping " - "linkage to StorageClass"); } llvm_unreachable("Unknown linkage type!"); } diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 84f870f4a58..051c800600c 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -1728,7 +1728,7 @@ bool PPCAIXAsmPrinter::doInitialization(Module &M) { auto setCsectAlignment = [this](const GlobalObject *GO) { // Declarations have 0 alignment which is set by default. - if (GO->isDeclaration()) + if (GO->isDeclarationForLinker()) return; SectionKind GOKind = getObjFileLowering().getKindForGlobal(GO, TM); diff --git a/lib/Target/TargetLoweringObjectFile.cpp b/lib/Target/TargetLoweringObjectFile.cpp index bd256600c5f..eea0aeea2c4 100644 --- a/lib/Target/TargetLoweringObjectFile.cpp +++ b/lib/Target/TargetLoweringObjectFile.cpp @@ -143,7 +143,7 @@ void TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer, /// may be overridden by the target implementation. SectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM){ - assert(!GO->isDeclaration() && !GO->hasAvailableExternallyLinkage() && + assert(!GO->isDeclarationForLinker() && "Can only be used for global definitions"); // Functions are classified as text sections. diff --git a/test/CodeGen/PowerPC/aix-available-externally-linkage.ll b/test/CodeGen/PowerPC/aix-available-externally-linkage.ll new file mode 100644 index 00000000000..a0201f63515 --- /dev/null +++ b/test/CodeGen/PowerPC/aix-available-externally-linkage.ll @@ -0,0 +1,39 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \ +; RUN: -mattr=-altivec < %s | \ +; RUN: FileCheck %s + +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \ +; RUN: -mattr=-altivec < %s | \ +; RUN: FileCheck %s + +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \ +; RUN: -mattr=-altivec -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --symbols %t.o | \ +; RUN: FileCheck --check-prefix=XCOFF32 %s + +; RUN: not --crash llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff \ +; RUN: -mcpu=pwr4 -mattr=-altivec -filetype=obj -o %t.o 2>&1 < %s | \ +; RUN: FileCheck --check-prefix=XCOFF64 %s +; XCOFF64: LLVM ERROR: 64-bit XCOFF object files are not supported yet. + +@_ZN3Foo1aE = available_externally constant i32 -1 + +; CHECK: .extern _ZN3Foo1aE[UA] + +; XCOFF32: Index: [[#Index:]]{{.*}}{{[[:space:]] *}}Name: _ZN3Foo1aE +; XCOFF32-NEXT: Value (RelocatableAddress): 0x0 +; XCOFF32-NEXT: Section: N_UNDEF +; XCOFF32-NEXT: Type: 0x0 +; XCOFF32-NEXT: StorageClass: C_EXT (0x2) +; XCOFF32-NEXT: NumberOfAuxEntries: 1 +; XCOFF32-NEXT: CSECT Auxiliary Entry { +; XCOFF32-NEXT: Index: [[#Index+1]] +; XCOFF32-NEXT: SectionLen: 0 +; XCOFF32-NEXT: ParameterHashIndex: 0x0 +; XCOFF32-NEXT: TypeChkSectNum: 0x0 +; XCOFF32-NEXT: SymbolAlignmentLog2: 0 +; XCOFF32-NEXT: SymbolType: XTY_ER (0x0) +; XCOFF32-NEXT: StorageMappingClass: XMC_UA (0x4) +; XCOFF32-NEXT: StabInfoIndex: 0x0 +; XCOFF32-NEXT: StabSectNum: 0x0 +; XCOFF32-NEXT: }