diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp --- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -421,7 +421,8 @@ } return; case GlobalValue::ExternalLinkage: - if (MAI->hasDotExternDirective() && GV->isDeclaration()) + case GlobalValue::AvailableExternallyLinkage: + if (MAI->hasDotExternDirective() && GV->isDeclarationForLinker()) OutStreamer->emitSymbolAttribute(GVSym, MCSA_Extern); else OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global); @@ -439,7 +440,6 @@ } LLVM_FALLTHROUGH; case GlobalValue::AppendingLinkage: - case GlobalValue::AvailableExternallyLinkage: llvm_unreachable("Should never emit this"); } llvm_unreachable("Unknown linkage type!"); diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -1979,7 +1979,7 @@ // 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(); @@ -2007,7 +2007,7 @@ 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; @@ -2129,6 +2129,7 @@ return XCOFF::C_HIDEXT; case GlobalValue::ExternalLinkage: case GlobalValue::CommonLinkage: + case GlobalValue::AvailableExternallyLinkage: return XCOFF::C_EXT; case GlobalValue::ExternalWeakLinkage: case GlobalValue::LinkOnceAnyLinkage: @@ -2139,9 +2140,6 @@ 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/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -1769,7 +1769,7 @@ 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/llvm/test/CodeGen/PowerPC/aix-available-extern.ll b/llvm/test/CodeGen/PowerPC/aix-available-extern.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-available-extern.ll @@ -0,0 +1,86 @@ +; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 -mattr=-altivec < %s | \ +; RUN: FileCheck --check-prefixes=COMMON,BIT32 %s + +; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 -mattr=-altivec < %s | \ +; RUN: FileCheck --check-prefixes=COMMON,BIT64 %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 | FileCheck --check-prefix=CHECKSYM %s + +; RUN: not --crash llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc64-ibm-aix-xcoff \ +; RUN: -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. + +%class.DoFHandler = type { [5 x i32] } + +@_ZN10DoFHandlerILi5EE17invalid_dof_indexE = available_externally constant i32 -1, align 4 + +define i32 @_Z3fooRKi(i32* dereferenceable(4) %b) { +entry: + %b.addr = alloca i32*, align 4 + store i32* %b, i32** %b.addr, align 4 + %0 = load i32*, i32** %b.addr, align 4 + %1 = load i32, i32* %0, align 4 + %add = add nsw i32 %1, 1 + ret i32 %add +} + +define float @_Z3barv() { +entry: + %dof = alloca %class.DoFHandler, align 4 + %a = getelementptr inbounds %class.DoFHandler, %class.DoFHandler* %dof, i32 0, i32 0 + %arrayidx = getelementptr inbounds [5 x i32], [5 x i32]* %a, i32 0, i32 0 + store i32 1, i32* %arrayidx, align 4 + %call = call i32 @_Z3fooRKi(i32* dereferenceable(4) @_ZN10DoFHandlerILi5EE17invalid_dof_indexE) + %a1 = getelementptr inbounds %class.DoFHandler, %class.DoFHandler* %dof, i32 0, i32 0 + %arrayidx2 = getelementptr inbounds [5 x i32], [5 x i32]* %a1, i32 0, i32 0 + %0 = load i32, i32* %arrayidx2, align 4 + %add = add nsw i32 %call, %0 + %conv = sitofp i32 %add to float + ret float %conv +} + +; COMMON: .extern _ZN10DoFHandlerILi5EE17invalid_dof_indexE[UA] +; COMMON: .tc _ZN10DoFHandlerILi5EE17invalid_dof_indexE[TC],_ZN10DoFHandlerILi5EE17invalid_dof_indexE[UA] + +; CHECKSYM: Symbol { +; CHECKSYM-NEXT: Index: [[#Index:]] +; CHECKSYM-NEXT: Name: _ZN10DoFHandlerILi5EE17invalid_dof_indexE +; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0 +; CHECKSYM-NEXT: Section: N_UNDEF +; CHECKSYM-NEXT: Type: 0x0 +; CHECKSYM-NEXT: StorageClass: C_EXT (0x2) +; CHECKSYM-NEXT: NumberOfAuxEntries: 1 +; CHECKSYM-NEXT: CSECT Auxiliary Entry { +; CHECKSYM-NEXT: Index: [[#Index+1]] +; CHECKSYM-NEXT: SectionLen: 0 +; CHECKSYM-NEXT: ParameterHashIndex: 0x0 +; CHECKSYM-NEXT: TypeChkSectNum: 0x0 +; CHECKSYM-NEXT: SymbolAlignmentLog2: 0 +; CHECKSYM-NEXT: SymbolType: XTY_ER (0x0) +; CHECKSYM-NEXT: StorageMappingClass: XMC_UA (0x4) +; CHECKSYM-NEXT: StabInfoIndex: 0x0 +; CHECKSYM-NEXT: StabSectNum: 0x0 +; CHECKSYM-NEXT: } +; CHECKSYM-NEXT: } + +; CHECKSYM: Index: [[#Index:]]{{.*}}{{[[:space:]] *}}Name: _ZN10DoFHandlerILi5EE17invalid_dof_indexE +; CHECKSYM-NEXT: Value (RelocatableAddress): 0x98 +; CHECKSYM-NEXT: Section: .data +; CHECKSYM-NEXT: Type: 0x0 +; CHECKSYM-NEXT: StorageClass: C_HIDEXT (0x6B) +; CHECKSYM-NEXT: NumberOfAuxEntries: 1 +; CHECKSYM-NEXT: CSECT Auxiliary Entry { +; CHECKSYM-NEXT: Index: [[#Index+1]] +; CHECKSYM-NEXT: SectionLen: 4 +; CHECKSYM-NEXT: ParameterHashIndex: 0x0 +; CHECKSYM-NEXT: TypeChkSectNum: 0x0 +; CHECKSYM-NEXT: SymbolAlignmentLog2: 2 +; CHECKSYM-NEXT: SymbolType: XTY_SD (0x1) +; CHECKSYM-NEXT: StorageMappingClass: XMC_TC (0x3) +; CHECKSYM-NEXT: StabInfoIndex: 0x0 +; CHECKSYM-NEXT: StabSectNum: 0x0 +; CHECKSYM-NEXT: } +; CHECKSYM-NEXT: }