Index: llvm/lib/MC/XCOFFObjectWriter.cpp =================================================================== --- llvm/lib/MC/XCOFFObjectWriter.cpp +++ llvm/lib/MC/XCOFFObjectWriter.cpp @@ -343,29 +343,27 @@ const MCSymbolXCOFF *XSym = cast(&S); const MCSectionXCOFF *ContainingCsect = XSym->getContainingCsect(); - // Handle undefined symbol. if (ContainingCsect->getCSectType() == XCOFF::XTY_ER) { + // Handle undefined symbol. UndefinedCsects.emplace_back(ContainingCsect); SectionMap[ContainingCsect] = &UndefinedCsects.back(); - continue; - } - - // If the symbol is the csect itself, we don't need to put the symbol - // into csect's Syms. - if (XSym == ContainingCsect->getQualNameSymbol()) - continue; - - assert(SectionMap.find(ContainingCsect) != SectionMap.end() && - "Expected containing csect to exist in map"); + } else { + // If the symbol is the csect itself, we don't need to put the symbol + // into csect's Syms. + if (XSym == ContainingCsect->getQualNameSymbol()) + continue; - // Lookup the containing csect and add the symbol to it. - SectionMap[ContainingCsect]->Syms.emplace_back(XSym); + assert(SectionMap.find(ContainingCsect) != SectionMap.end() && + "Expected containing csect to exist in map"); + // Lookup the containing csect and add the symbol to it. + SectionMap[ContainingCsect]->Syms.emplace_back(XSym); + } // If the name does not fit in the storage provided in the symbol table // entry, add it to the string table. if (nameShouldBeInStringTable(XSym->getName())) Strings.add(XSym->getName()); - } + } Strings.finalize(); assignAddressesAndIndices(Layout); Index: llvm/test/CodeGen/PowerPC/aix-undef-func-call.ll =================================================================== --- llvm/test/CodeGen/PowerPC/aix-undef-func-call.ll +++ llvm/test/CodeGen/PowerPC/aix-undef-func-call.ll @@ -4,10 +4,12 @@ define void @bar() { entry: call void bitcast (void (...)* @foo to void ()*)() + call void bitcast (void (...)* @long_undef_name to void ()*)() ret void } declare void @foo(...) +declare void @long_undef_name(...) ;CHECK: Symbol { ;CHECK: Name: .foo @@ -27,3 +29,21 @@ ;CHECK-NEXT: StabSectNum: 0x0 ;CHECK-NEXT: } ;CHECK-NEXT: } +;CHECK: Symbol { +;CHECK: Name: .long_undef_name +;CHECK-NEXT: Value (RelocatableAddress): 0x0 +;CHECK-NEXT: Section: N_UNDEF +;CHECK-NEXT: Type: 0x0 +;CHECK-NEXT: StorageClass: C_EXT (0x2) +;CHECK-NEXT: NumberOfAuxEntries: 1 +;CHECK-NEXT: CSECT Auxiliary Entry { +;CHECK: SectionLen: 0 +;CHECK-NEXT: ParameterHashIndex: 0x0 +;CHECK-NEXT: TypeChkSectNum: 0x0 +;CHECK-NEXT: SymbolAlignmentLog2: 0 +;CHECK-NEXT: SymbolType: XTY_ER (0x0) +;CHECK-NEXT: StorageMappingClass: XMC_PR (0x0) +;CHECK-NEXT: StabInfoIndex: 0x0 +;CHECK-NEXT: StabSectNum: 0x0 +;CHECK-NEXT: } +;CHECK-NEXT: }