Skip to content

Commit b91f798

Browse files
author
diggerlin
committed
implement printing out raw section data of xcoff objectfile for llvm-objdump
SUMMARY: implement printing out raw section data of xcoff objectfile for llvm-objdump and option -D --disassemble-all option for llvm-objdump Reviewers: Sean Fertile Subscribers: rupprecht, seiyai,hiraditya Differential Revision: https://reviews.llvm.org/D70255
1 parent f55cd39 commit b91f798

File tree

3 files changed

+107
-8
lines changed

3 files changed

+107
-8
lines changed

llvm/lib/Object/XCOFFObjectFile.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,8 @@ Expected<StringRef> XCOFFObjectFile::getSymbolName(DataRefImpl Symb) const {
191191
}
192192

193193
Expected<uint64_t> XCOFFObjectFile::getSymbolAddress(DataRefImpl Symb) const {
194-
uint64_t Result = 0;
195-
llvm_unreachable("Not yet implemented!");
196-
return Result;
194+
assert(!is64Bit() && "Symbol table support not implemented for 64-bit.");
195+
return toSymbolEntry(Symb)->Value;
197196
}
198197

199198
uint64_t XCOFFObjectFile::getSymbolValueImpl(DataRefImpl Symb) const {
@@ -266,7 +265,19 @@ uint64_t XCOFFObjectFile::getSectionSize(DataRefImpl Sec) const {
266265

267266
Expected<ArrayRef<uint8_t>>
268267
XCOFFObjectFile::getSectionContents(DataRefImpl Sec) const {
269-
llvm_unreachable("Not yet implemented!");
268+
if (isSectionVirtual(Sec))
269+
return ArrayRef<uint8_t>();
270+
271+
const uint64_t OffsetToRaw = is64Bit()
272+
? toSection64(Sec)->FileOffsetToRawData
273+
: toSection32(Sec)->FileOffsetToRawData;
274+
275+
const uint8_t * ContentStart = base() + OffsetToRaw;
276+
uint64_t SectionSize = getSectionSize(Sec);
277+
if (checkOffset(Data, uintptr_t(ContentStart), SectionSize))
278+
return make_error<BinaryError>();
279+
280+
return makeArrayRef(ContentStart,SectionSize);
270281
}
271282

272283
uint64_t XCOFFObjectFile::getSectionAlignment(DataRefImpl Sec) const {
@@ -296,9 +307,8 @@ bool XCOFFObjectFile::isSectionBSS(DataRefImpl Sec) const {
296307
}
297308

298309
bool XCOFFObjectFile::isSectionVirtual(DataRefImpl Sec) const {
299-
bool Result = false;
300-
llvm_unreachable("Not yet implemented!");
301-
return Result;
310+
return is64Bit() ? toSection64(Sec)->FileOffsetToRawData == 0
311+
: toSection32(Sec)->FileOffsetToRawData == 0;
302312
}
303313

304314
relocation_iterator XCOFFObjectFile::section_rel_begin(DataRefImpl Sec) const {
@@ -384,7 +394,6 @@ Triple::ArchType XCOFFObjectFile::getArch() const {
384394
}
385395

386396
SubtargetFeatures XCOFFObjectFile::getFeatures() const {
387-
llvm_unreachable("Not yet implemented!");
388397
return SubtargetFeatures();
389398
}
390399

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# RUN: llvm-objdump -D %p/Inputs/xcoff-section-headers.o | \
2+
# RUN: FileCheck %s
3+
4+
# xcoff-section-headers.o Compiled with IBM XL C/C++ for AIX, V16.1.0
5+
# compiler command: xlc -qtls -o xcoff-section-headers.o -c test.c
6+
# test.c:
7+
# int a;
8+
# int b = 12345;
9+
# __thread int c;
10+
# __thread double d = 3.14159;
11+
#
12+
# int func(void) {
13+
# return a;
14+
# }
15+
; REQUIRES: powerpc-registered-target
16+
CHECK: Inputs/xcoff-section-headers.o: file format aixcoff-rs6000
17+
CHECK: Disassembly of section .text:
18+
CHECK: 00000000 .text:
19+
CHECK-NEXT: 0: 80 62 00 04 lwz 3, 4(2)
20+
CHECK-NEXT: 4: 80 63 00 00 lwz 3, 0(3)
21+
CHECK-NEXT: 8: 4e 80 00 20 blr
22+
CHECK-NEXT: c: 00 00 00 00 <unknown>
23+
CHECK-NEXT: 10: 00 00 20 40 <unknown>
24+
CHECK-NEXT: 14: 00 00 00 01 <unknown>
25+
CHECK-NEXT: 18: 00 00 00 0c <unknown>
26+
CHECK-NEXT: 1c: 00 04 66 75 <unknown>
27+
CHECK-NEXT: 20: 6e 63 00 00 xoris 3, 19, 0
28+
CHECK-NEXT: ...
29+
CHECK: Disassembly of section .data:
30+
CHECK: 00000080 func:
31+
CHECK-NEXT: 80: 00 00 00 94 <unknown>
32+
CHECK: 00000084 a:
33+
CHECK-NEXT: 84: 00 00 00 a4 <unknown>
34+
CHECK: 00000088 b:
35+
CHECK-NEXT: 88: 00 00 00 a0 <unknown>
36+
CHECK: 0000008c c:
37+
CHECK-NEXT: 8c: 00 00 00 08 <unknown>
38+
CHECK: 00000090 d:
39+
CHECK-NEXT: 90: 00 00 00 00 <unknown>
40+
CHECK: 00000094 func:
41+
CHECK-NEXT: 94: 00 00 00 00 <unknown>
42+
CHECK-NEXT: 98: 00 00 00 80 <unknown>
43+
CHECK-NEXT: 9c: 00 00 00 00 <unknown>
44+
CHECK: 000000a0 b:
45+
CHECK-NEXT: a0: 00 00 30 39 <unknown>
46+
CHECK: Disassembly of section .bss:
47+
CHECK: 000000a4 a:
48+
CHECK-NEXT: ...
49+
CHECK: Disassembly of section .tdata:
50+
CHECK: 00000000 d:
51+
CHECK-NEXT: 0: 40 09 21 f9 bdnzfl 9, .+8696
52+
CHECK-NEXT: 4: f0 1b 86 6e <unknown>
53+
CHECK: Disassembly of section .tbss:
54+
CHECK: 00000008 c:
55+
CHECK-NEXT: ...
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# RUN: llvm-objdump --full-contents %p/Inputs/xcoff-section-headers.o | \
2+
# RUN: FileCheck %s
3+
4+
# CHECK: Inputs/xcoff-section-headers.o: file format aixcoff-rs6000
5+
# CHECK: Contents of section .text:
6+
# CHECK-NEXT: 0000 80620004 80630000 4e800020 00000000 .b...c..N.. ....
7+
# CHECK-NEXT: 0010 00002040 00000001 0000000c 00046675 .. @..........fu
8+
# CHECK-NEXT: 0020 6e630000 00000000 00000000 00000000 nc..............
9+
# CHECK-NEXT: 0030 00000000 00000000 00000000 00000000 ................
10+
# CHECK-NEXT: 0040 00000000 00000000 00000000 00000000 ................
11+
# CHECK-NEXT: 0050 00000000 00000000 00000000 00000000 ................
12+
# CHECK-NEXT: 0060 00000000 00000000 00000000 00000000 ................
13+
# CHECK-NEXT: 0070 00000000 00000000 00000000 00000000 ................
14+
# CHECK-NEXT: Contents of section .data:
15+
# CHECK-NEXT: 0080 00000094 000000a4 000000a0 00000008 ................
16+
# CHECK-NEXT: 0090 00000000 00000000 00000080 00000000 ................
17+
# CHECK-NEXT: 00a0 00003039 ..09
18+
# CHECK-NEXT: Contents of section .bss:
19+
# CHECK-NEXT: <skipping contents of bss section at [00a4, 00a8)>
20+
# CHECK-NEXT: Contents of section .tdata:
21+
# CHECK-NEXT: 0000 400921f9 f01b866e @.!....n
22+
# CHECK-NEXT: Contents of section .tbss:
23+
# CHECK-NEXT: <skipping contents of bss section at [0008, 000c)>
24+
25+
# xcoff-section-headers.o Compiled with IBM XL C/C++ for AIX, V16.1.0
26+
# compiler command: xlc -qtls -o xcoff-section-headers.o -c test.c
27+
# test.c:
28+
# int a;
29+
# int b = 12345;
30+
# __thread int c;
31+
# __thread double d = 3.14159;
32+
#
33+
# int func(void) {
34+
# return a;
35+
# }

0 commit comments

Comments
 (0)