Index: llvm/lib/MC/XCOFFObjectWriter.cpp =================================================================== --- llvm/lib/MC/XCOFFObjectWriter.cpp +++ llvm/lib/MC/XCOFFObjectWriter.cpp @@ -157,15 +157,17 @@ // the sections. Should have one for each set of csects that get mapped into // the same section and get handled in a 'similar' way. CsectGroup ProgramCodeCsects{CsectGroup::LabelDefSupported, {}}; + CsectGroup DataCsects{CsectGroup::LabelDefSupported, {}}; CsectGroup BSSCsects{CsectGroup::LabelDefUnsupported, {}}; // The Predefined sections. Section Text; + Section Data; Section BSS; // All the XCOFF sections, in the order they will appear in the section header // table. - std::array
Sections{{&Text, &BSS}}; + std::array
Sections{{&Text, &Data, &BSS}}; CsectGroup &getCsectGroup(const MCSectionXCOFF *MCSec); @@ -223,6 +225,8 @@ Strings(StringTableBuilder::XCOFF), Text(".text", XCOFF::STYP_TEXT, /* IsVirtual */ false, CsectGroups{&ProgramCodeCsects}), + Data(".data", XCOFF::STYP_DATA, /* IsVirtual */ false, + CsectGroups{&DataCsects}), BSS(".bss", XCOFF::STYP_BSS, /* IsVirtual */ true, CsectGroups{&BSSCsects}) {} @@ -249,6 +253,9 @@ if (XCOFF::XTY_CM == MCSec->getCSectType()) return BSSCsects; + if (XCOFF::XTY_SD == MCSec->getCSectType()) + return DataCsects; + report_fatal_error("Unhandled mapping of read-write csect to section."); case XCOFF::XMC_BS: assert(XCOFF::XTY_CM == MCSec->getCSectType() && Index: llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll =================================================================== --- llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll +++ llvm/test/CodeGen/PowerPC/aix-xcoff-data.ll @@ -1,15 +1,27 @@ ; RUN: llc -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s ; RUN: llc -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s +; RUN: llc -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s +; RUN: llvm-readobj --symbols --section-headers %t.o | \ +; RUN: FileCheck --check-prefix=OBJ %s + +; RUN: not llc -mtriple powerpc64-ibm-aix-xcoff -filetype=obj < %s 2>&1 | \ +; RUN: FileCheck --check-prefix=XCOFF64 %s +; XCOFF64: LLVM ERROR: 64-bit XCOFF object files are not supported yet. + @ivar = local_unnamed_addr global i32 35, align 4 @llvar = local_unnamed_addr global i64 36, align 8 @svar = local_unnamed_addr global i16 37, align 2 @fvar = local_unnamed_addr global float 8.000000e+02, align 4 @dvar = local_unnamed_addr global double 9.000000e+02, align 8 @over_aligned = local_unnamed_addr global double 9.000000e+02, align 32 -@charr = local_unnamed_addr global [4 x i8] c"abcd", align 1 +@chrarray = local_unnamed_addr global [4 x i8] c"abcd", align 1 @dblarr = local_unnamed_addr global [4 x double] [double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00], align 8 +@a = common global i32 0, align 4 +@b = common global i64 0, align 8 +@c = common global i16 0, align 2 + ; CHECK: .csect .data[RW] ; CHECK-NEXT: .globl ivar ; CHECK-NEXT: .align 2 @@ -41,8 +53,8 @@ ; CHECK-NEXT: over_aligned: ; CHECK-NEXT: .llong 4651127699538968576 -; CHECK: .globl charr -; CHECK-NEXT: charr: +; CHECK: .globl chrarray +; CHECK-NEXT: chrarray: ; CHECK-NEXT: .byte 97 ; CHECK-NEXT: .byte 98 ; CHECK-NEXT: .byte 99 @@ -55,3 +67,268 @@ ; CHECK-NEXT: .llong 4611686018427387904 ; CHECK-NEXT: .llong 4613937818241073152 ; CHECK-NEXT: .llong 4616189618054758400 + +; CHECK: .comm a,4,2 +; CHECK-NEXT: .comm b,8,3 +; CHECK-NEXT: .comm c,2,1 + +; OBJ: File: {{.*}}aix-xcoff-data.ll.tmp.o +; OBJ-NEXT: Format: aixcoff-rs6000 +; OBJ-NEXT: Arch: powerpc +; OBJ-NEXT: AddressSize: 32bit + +; OBJ: Sections [ +; OBJ: Section { +; OBJ-NEXT: Index: 1 +; OBJ-NEXT: Name: .text +; OBJ-NEXT: PhysicalAddress: 0x0 +; OBJ-NEXT: VirtualAddress: 0x0 +; OBJ-NEXT: Size: 0x0 +; OBJ-NEXT: RawDataOffset: 0x8C +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_TEXT (0x20) +; OBJ-NEXT: } + +; OBJ: Section { +; OBJ-NEXT: Index: 2 +; OBJ-NEXT: Name: .data +; OBJ-NEXT: PhysicalAddress: 0x0 +; OBJ-NEXT: VirtualAddress: 0x0 +; OBJ-NEXT: Size: 0x50 +; OBJ-NEXT: RawDataOffset: 0x8C +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_DATA (0x40) +; OBJ-NEXT: } + +; OBJ: Section { +; OBJ-NEXT: Index: 3 +; OBJ-NEXT: Name: .bss +; OBJ-NEXT: PhysicalAddress: 0x50 +; OBJ-NEXT: VirtualAddress: 0x50 +; OBJ-NEXT: Size: 0x14 +; OBJ-NEXT: RawDataOffset: 0x0 +; OBJ-NEXT: RelocationPointer: 0x0 +; OBJ-NEXT: LineNumberPointer: 0x0 +; OBJ-NEXT: NumberOfRelocations: 0 +; OBJ-NEXT: NumberOfLineNumbers: 0 +; OBJ-NEXT: Type: STYP_BSS (0x80) +; OBJ-NEXT: } +; OBJ: ] + +; OBJ: Symbols [ +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX:]] +; OBJ-NEXT: Name: .text +; OBJ-NEXT: Value (RelocatableAddress): 0x0 +; OBJ-NEXT: Section: .text +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_HIDEXT (0x6B) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+1]] +; OBJ-NEXT: SectionLen: 0 +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_SD (0x1) +; OBJ-NEXT: StorageMappingClass: XMC_PR (0x0) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+2]] +; OBJ-NEXT: Name: .data +; OBJ-NEXT: Value (RelocatableAddress): 0x0 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_HIDEXT (0x6B) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+3]] +; OBJ-NEXT: SectionLen: 80 +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 5 +; OBJ-NEXT: SymbolType: XTY_SD (0x1) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+4]] +; OBJ-NEXT: Name: ivar +; OBJ-NEXT: Value (RelocatableAddress): 0x0 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+5]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+6]] +; OBJ-NEXT: Name: llvar +; OBJ-NEXT: Value (RelocatableAddress): 0x8 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+7]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+8]] +; OBJ-NEXT: Name: svar +; OBJ-NEXT: Value (RelocatableAddress): 0x10 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+9]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+10]] +; OBJ-NEXT: Name: fvar +; OBJ-NEXT: Value (RelocatableAddress): 0x14 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+11]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+12]] +; OBJ-NEXT: Name: dvar +; OBJ-NEXT: Value (RelocatableAddress): 0x18 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+13]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+14]] +; OBJ-NEXT: Name: over_aligned +; OBJ-NEXT: Value (RelocatableAddress): 0x20 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+15]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+16]] +; OBJ-NEXT: Name: chrarray +; OBJ-NEXT: Value (RelocatableAddress): 0x28 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+17]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } + +; OBJ: Symbol { +; OBJ-NEXT: Index: [[#INDX+18]] +; OBJ-NEXT: Name: dblarr +; OBJ-NEXT: Value (RelocatableAddress): 0x30 +; OBJ-NEXT: Section: .data +; OBJ-NEXT: Type: 0x0 +; OBJ-NEXT: StorageClass: C_EXT (0x2) +; OBJ-NEXT: NumberOfAuxEntries: 1 +; OBJ-NEXT: CSECT Auxiliary Entry { +; OBJ-NEXT: Index: [[#INDX+19]] +; OBJ-NEXT: ContainingCsectSymbolIndex: [[#INDX+2]] +; OBJ-NEXT: ParameterHashIndex: 0x0 +; OBJ-NEXT: TypeChkSectNum: 0x0 +; OBJ-NEXT: SymbolAlignmentLog2: 0 +; OBJ-NEXT: SymbolType: XTY_LD (0x2) +; OBJ-NEXT: StorageMappingClass: XMC_RW (0x5) +; OBJ-NEXT: StabInfoIndex: 0x0 +; OBJ-NEXT: StabSectNum: 0x0 +; OBJ-NEXT: } +; OBJ-NEXT: } +; OBJ: ]