Skip to content

Commit c9edaa8

Browse files
committed
[AIX][XCOFF] Write Function descriptors and TOC base to data section
This patch implements writing function descriptors and TOC base into data section, and also add function descriptors(both csect and label) and TOC base symbols to the symbol table.
1 parent 9806536 commit c9edaa8

File tree

2 files changed

+125
-6
lines changed

2 files changed

+125
-6
lines changed

llvm/lib/MC/XCOFFObjectWriter.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,8 @@ class XCOFFObjectWriter : public MCObjectWriter {
151151
// the same section and get handled in a 'similar' way.
152152
CsectGroup ProgramCodeCsects;
153153
CsectGroup DataCsects;
154+
CsectGroup FuncDSCsects;
155+
CsectGroup TOCCsects;
154156
CsectGroup BSSCsects;
155157

156158
// The Predefined sections.
@@ -219,7 +221,7 @@ XCOFFObjectWriter::XCOFFObjectWriter(
219221
Text(".text", XCOFF::STYP_TEXT, /* IsVirtual */ false,
220222
CsectGroups{&ProgramCodeCsects}),
221223
Data(".data", XCOFF::STYP_DATA, /* IsVirtual */ false,
222-
CsectGroups{&DataCsects}),
224+
CsectGroups{&DataCsects, &FuncDSCsects, &TOCCsects}),
223225
BSS(".bss", XCOFF::STYP_BSS, /* IsVirtual */ true,
224226
CsectGroups{&BSSCsects}) {}
225227

@@ -251,11 +253,20 @@ CsectGroup &XCOFFObjectWriter::getCsectGroup(const MCSectionXCOFF *MCSec) {
251253
return DataCsects;
252254

253255
report_fatal_error("Unhandled mapping of read-write csect to section.");
256+
case XCOFF::XMC_DS:
257+
return FuncDSCsects;
254258
case XCOFF::XMC_BS:
255259
assert(XCOFF::XTY_CM == MCSec->getCSectType() &&
256260
"Mapping invalid csect. CSECT with bss storage class must be "
257261
"common type.");
258262
return BSSCsects;
263+
case XCOFF::XMC_TC0:
264+
assert(XCOFF::XTY_SD == MCSec->getCSectType() &&
265+
"Only an initialized csect can contain TOC-base.");
266+
assert(TOCCsects.empty() &&
267+
"We should have only one TOC-base, and it should be the first csect "
268+
"in this CsectGroup.");
269+
return TOCCsects;
259270
default:
260271
report_fatal_error("Unhandled mapping of csect to section.");
261272
}
@@ -281,10 +292,6 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
281292
if (nameShouldBeInStringTable(MCSec->getSectionName()))
282293
Strings.add(MCSec->getSectionName());
283294

284-
// TODO FIXME Handle emiting the TOC base.
285-
if (MCSec->getMappingClass() == XCOFF::XMC_TC0)
286-
continue;
287-
288295
CsectGroup &Group = getCsectGroup(MCSec);
289296
Group.emplace_back(MCSec);
290297
WrapperMap[MCSec] = &Group.back();
@@ -322,7 +329,7 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
322329
void XCOFFObjectWriter::recordRelocation(MCAssembler &, const MCAsmLayout &,
323330
const MCFragment *, const MCFixup &,
324331
MCValue, uint64_t &) {
325-
report_fatal_error("XCOFF relocations not supported.");
332+
// TODO: recordRelocation is not yet implemented.
326333
}
327334

328335
void XCOFFObjectWriter::writeSections(const MCAssembler &Asm,
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s
2+
; RUN: llvm-readobj --symbols %t.o | FileCheck %s
3+
4+
define void @foo() {
5+
entry:
6+
ret void
7+
}
8+
9+
; CHECK: File: {{.*}}aix-func-dsc-gen.ll.tmp.o
10+
; CHECK-NEXT: Format: aixcoff-rs6000
11+
; CHECK-NEXT: Arch: powerpc
12+
; CHECK-NEXT: AddressSize: 32bit
13+
; CHECK: Symbol {
14+
; CHECK-NEXT: Index: [[#Index:]]
15+
; CHECK-NEXT: Name: .text
16+
; CHECK-NEXT: Value (RelocatableAddress): 0x0
17+
; CHECK-NEXT: Section: .text
18+
; CHECK-NEXT: Type: 0x0
19+
; CHECK-NEXT: StorageClass: C_HIDEXT (0x6B)
20+
; CHECK-NEXT: NumberOfAuxEntries: 1
21+
; CHECK-NEXT: CSECT Auxiliary Entry {
22+
; CHECK-NEXT: Index: [[#Index+1]]
23+
; CHECK-NEXT: SectionLen: 4
24+
; CHECK-NEXT: ParameterHashIndex: 0x0
25+
; CHECK-NEXT: TypeChkSectNum: 0x0
26+
; CHECK-NEXT: SymbolAlignmentLog2: 4
27+
; CHECK-NEXT: SymbolType: XTY_SD (0x1)
28+
; CHECK-NEXT: StorageMappingClass: XMC_PR (0x0)
29+
; CHECK-NEXT: StabInfoIndex: 0x0
30+
; CHECK-NEXT: StabSectNum: 0x0
31+
; CHECK-NEXT: }
32+
; CHECK-NEXT: }
33+
; CHECK-NEXT: Symbol {
34+
; CHECK-NEXT: Index: [[#Index+2]]
35+
; CHECK-NEXT: Name: .foo
36+
; CHECK-NEXT: Value (RelocatableAddress): 0x0
37+
; CHECK-NEXT: Section: .text
38+
; CHECK-NEXT: Type: 0x0
39+
; CHECK-NEXT: StorageClass: C_EXT (0x2)
40+
; CHECK-NEXT: NumberOfAuxEntries: 1
41+
; CHECK-NEXT: CSECT Auxiliary Entry {
42+
; CHECK-NEXT: Index: [[#Index+3]]
43+
; CHECK-NEXT: ContainingCsectSymbolIndex: [[#Index]]
44+
; CHECK-NEXT: ParameterHashIndex: 0x0
45+
; CHECK-NEXT: TypeChkSectNum: 0x0
46+
; CHECK-NEXT: SymbolAlignmentLog2: 0
47+
; CHECK-NEXT: SymbolType: XTY_LD (0x2)
48+
; CHECK-NEXT: StorageMappingClass: XMC_PR (0x0)
49+
; CHECK-NEXT: StabInfoIndex: 0x0
50+
; CHECK-NEXT: StabSectNum: 0x0
51+
; CHECK-NEXT: }
52+
; CHECK-NEXT: }
53+
; CHECK-NEXT: Symbol {
54+
; CHECK-NEXT: Index: [[#Index+4]]
55+
; CHECK-NEXT: Name: foo
56+
; CHECK-NEXT: Value (RelocatableAddress): 0x4
57+
; CHECK-NEXT: Section: .data
58+
; CHECK-NEXT: Type: 0x0
59+
; CHECK-NEXT: StorageClass: C_HIDEXT (0x6B)
60+
; CHECK-NEXT: NumberOfAuxEntries: 1
61+
; CHECK-NEXT: CSECT Auxiliary Entry {
62+
; CHECK-NEXT: Index: [[#Index+5]]
63+
; CHECK-NEXT: SectionLen: 12
64+
; CHECK-NEXT: ParameterHashIndex: 0x0
65+
; CHECK-NEXT: TypeChkSectNum: 0x0
66+
; CHECK-NEXT: SymbolAlignmentLog2: 0
67+
; CHECK-NEXT: SymbolType: XTY_SD (0x1)
68+
; CHECK-NEXT: StorageMappingClass: XMC_DS (0xA)
69+
; CHECK-NEXT: StabInfoIndex: 0x0
70+
; CHECK-NEXT: StabSectNum: 0x0
71+
; CHECK-NEXT: }
72+
; CHECK-NEXT: }
73+
; CHECK-NEXT: Symbol {
74+
; CHECK-NEXT: Index: [[#Index+6]]
75+
; CHECK-NEXT: Name: foo
76+
; CHECK-NEXT: Value (RelocatableAddress): 0x4
77+
; CHECK-NEXT: Section: .data
78+
; CHECK-NEXT: Type: 0x0
79+
; CHECK-NEXT: StorageClass: C_EXT (0x2)
80+
; CHECK-NEXT: NumberOfAuxEntries: 1
81+
; CHECK-NEXT: CSECT Auxiliary Entry {
82+
; CHECK-NEXT: Index: [[#Index+7]]
83+
; CHECK-NEXT: ContainingCsectSymbolIndex: [[#Index+4]]
84+
; CHECK-NEXT: ParameterHashIndex: 0x0
85+
; CHECK-NEXT: TypeChkSectNum: 0x0
86+
; CHECK-NEXT: SymbolAlignmentLog2: 0
87+
; CHECK-NEXT: SymbolType: XTY_LD (0x2)
88+
; CHECK-NEXT: StorageMappingClass: XMC_DS (0xA)
89+
; CHECK-NEXT: StabInfoIndex: 0x0
90+
; CHECK-NEXT: StabSectNum: 0x0
91+
; CHECK-NEXT: }
92+
; CHECK-NEXT: }
93+
; CHECK-NEXT: Symbol {
94+
; CHECK-NEXT: Index: [[#Index+8]]
95+
; CHECK-NEXT: Name: TOC
96+
; CHECK-NEXT: Value (RelocatableAddress): 0x10
97+
; CHECK-NEXT: Section: .data
98+
; CHECK-NEXT: Type: 0x0
99+
; CHECK-NEXT: StorageClass: C_HIDEXT (0x6B)
100+
; CHECK-NEXT: NumberOfAuxEntries: 1
101+
; CHECK-NEXT: CSECT Auxiliary Entry {
102+
; CHECK-NEXT: Index: [[#Index+9]]
103+
; CHECK-NEXT: SectionLen: 0
104+
; CHECK-NEXT: ParameterHashIndex: 0x0
105+
; CHECK-NEXT: TypeChkSectNum: 0x0
106+
; CHECK-NEXT: SymbolAlignmentLog2: 0
107+
; CHECK-NEXT: SymbolType: XTY_SD (0x1)
108+
; CHECK-NEXT: StorageMappingClass: XMC_TC0 (0xF)
109+
; CHECK-NEXT: StabInfoIndex: 0x0
110+
; CHECK-NEXT: StabSectNum: 0x0
111+
; CHECK-NEXT: }
112+
; CHECK-NEXT: }

0 commit comments

Comments
 (0)