From 8a23f74eb79f85879507809553555892673a9c01 Mon Sep 17 00:00:00 2001 From: Esme-Yi Date: Thu, 10 Jun 2021 04:37:06 +0000 Subject: [PATCH] [llvm-objdump][XCOFF] Enable the -l (--line-numbers) option. Summary: Add support for dumping line number information for XCOFF object files in llvm-objdump. Reviewed By: jhenderson Differential Revision: https://reviews.llvm.org/D101272 --- llvm/include/llvm/Object/XCOFFObjectFile.h | 2 +- llvm/lib/Object/SymbolSize.cpp | 6 ++- llvm/lib/Object/XCOFFObjectFile.cpp | 9 +++- .../test/tools/llvm-objdump/XCOFF/Inputs/basic32.o | Bin 0 -> 3075 bytes .../test/tools/llvm-objdump/XCOFF/Inputs/basic64.o | Bin 0 -> 3185 bytes .../tools/llvm-objdump/XCOFF/disassemble-all.test | 2 - .../XCOFF/disassemble-symbol-description.test | 2 - llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg | 2 + .../tools/llvm-objdump/XCOFF/print-linenumber.test | 50 +++++++++++++++++++++ .../test/tools/llvm-objdump/XCOFF/print-reloc.test | 2 - 10 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic32.o create mode 100644 llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic64.o create mode 100644 llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg create mode 100644 llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h index 7bd02fa..0ce53ed 100644 --- a/llvm/include/llvm/Object/XCOFFObjectFile.h +++ b/llvm/include/llvm/Object/XCOFFObjectFile.h @@ -370,7 +370,7 @@ public: const void *getPointerToSymbolTable() const { return SymbolTblPtr; } Expected getSymbolSectionName(XCOFFSymbolRef Ref) const; - + unsigned getSymbolSectionID(SymbolRef Sym) const; XCOFFSymbolRef toSymbolRef(DataRefImpl Ref) const; // File header related interfaces. diff --git a/llvm/lib/Object/SymbolSize.cpp b/llvm/lib/Object/SymbolSize.cpp index 97baabe..e42dbe6 100644 --- a/llvm/lib/Object/SymbolSize.cpp +++ b/llvm/lib/Object/SymbolSize.cpp @@ -12,6 +12,7 @@ #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/MachO.h" #include "llvm/Object/Wasm.h" +#include "llvm/Object/XCOFFObjectFile.h" using namespace llvm; using namespace object; @@ -30,7 +31,8 @@ static unsigned getSectionID(const ObjectFile &O, SectionRef Sec) { return M->getSectionID(Sec); if (isa(&O)) return Sec.getIndex(); - + if (isa(&O)) + return Sec.getIndex(); return cast(O).getSectionID(Sec); } @@ -39,6 +41,8 @@ static unsigned getSymbolSectionID(const ObjectFile &O, SymbolRef Sym) { return M->getSymbolSectionID(Sym); if (const auto *M = dyn_cast(&O)) return M->getSymbolSectionId(Sym); + if (const auto *M = dyn_cast(&O)) + return M->getSymbolSectionID(Sym); return cast(O).getSymbolSectionID(Sym); } diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index 6e54e4a..86e8c2e 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -214,7 +214,7 @@ uint64_t XCOFFObjectFile::getCommonSymbolSizeImpl(DataRefImpl Symb) const { Expected XCOFFObjectFile::getSymbolType(DataRefImpl Symb) const { - llvm_unreachable("Not yet implemented!"); + // TODO: Return the correct symbol type. return SymbolRef::ST_Other; } @@ -394,7 +394,7 @@ void XCOFFObjectFile::getRelocationTypeName( Expected XCOFFObjectFile::getSymbolFlags(DataRefImpl Symb) const { uint32_t Result = 0; - llvm_unreachable("Not yet implemented!"); + // TODO: Return correct symbol flags. return Result; } @@ -513,6 +513,11 @@ XCOFFObjectFile::getSymbolSectionName(XCOFFSymbolRef SymEntPtr) const { } } +unsigned XCOFFObjectFile::getSymbolSectionID(SymbolRef Sym) const { + XCOFFSymbolRef XCOFFSymRef(Sym.getRawDataRefImpl(), this); + return XCOFFSymRef.getSectionNumber(); +} + bool XCOFFObjectFile::isReservedSectionNumber(int16_t SectionNumber) { return (SectionNumber <= 0 && SectionNumber >= -2); } diff --git a/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic32.o b/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic32.o new file mode 100644 index 0000000000000000000000000000000000000000..3ab6a54b803d94593b775b9f69ab699447b2f157 GIT binary patch literal 3075 zcmeHJOHUL*5U!q?eZZ{Bict&%1_AY;!!xLuD363lA{Y`M#LK?eT{pslyQ|`D5;<`2 z$iV|Y!hhq%M1P6;RrTyJ!-Cm_pciY>-PKiJzpA@xN_{6gyZYrTQO8Xp8lgTSWrHK~ zP|%Bz=QfHvjfjYGW>iAtxa+w_PD`P0&Siq{&{9j9SvOy=YXKdg<#HT(?)v+UO0^i) zEfVo0mWK+PMlq-hxJtFOB_hB2OcVnf*WCmfCAeI^R($7UxXA+Jq5J@^DXwv~YB{oS zQysK1!ENWOo6WPZs+WitOL*Lo{h2qQR;YI{MjSDiFyhlDhVYC>DCDQNp}H*RX~i7+Ja)c){5*$#3>QBM z6ZkM(@(5;M&QF#KpV!}tr$%XMe%V=j>?}B?t(r5pw06sRUaZwCTUBR#+8xI?Mn>UP zu0|?pRH_ZKVmLD`vZ>1`&tkAnJanfttPD2uDwHb;0aGSZdRr}IGWup-LIayfji9FK z>5~PYBaelzL)J)NXsUvCH^BIJp5|ReXGiloo@E0<#(^5CQ6V~cxCN@ad>`^G< zE{5@-8>wk~#=dVqOwD#OA~8iqr)p)EKsZ=W*}<)HAm? z!9e8vEBu5(i}Iw~o8fe*e|>%r+dtbF+pi78o*c=a;K33bc?Thi+cWJyAPG!slSKSHV~ zn4u`f?*-!|5_-CO&sVx(H&)~rY<#9+-EejW`b#lZcF0L6=&FCx&<6L|0}Ym^1VZUf p-G(rSF~2p&&b=tEJIlG6Gk(Vzo1B@PoSB+*CdMYlopyd+zX5GRzw-b9 literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic64.o b/llvm/test/tools/llvm-objdump/XCOFF/Inputs/basic64.o new file mode 100644 index 0000000000000000000000000000000000000000..a7d2625a99f2d39bfb0164cee3e96a6858e2001b GIT binary patch literal 3185 zcmc&$Ur!T35TCufwpR|d_$QH&=xIQFFh?tjiix1Ufbnl)lqbpotyZOww*E_excFd9 zc+oda`~W;^eDMSL0sH`d4-+-u%+Bt0uM`Ub;}Uk}H}l)M-PzsgiXY(3-1@W#vSq)p zgu_9j^sJ#k8xgV1R_-CCbQN#BsveTImV% z*7Y-N;UVk1WJovT)T;M3Tv*$&rZE-AS(>dbn7KAt!wfPJOV{*qerzL7O%GjSYB&qnL&9Mt7ForzmxoSgxfz_Wfm0-s0v<0vTy-QX;Q zl`32RasNieUupSHq;bnk$lj+m5#TkV-WXA=y)k-+=s=7RKx%Cjtb6usSg*_lYuLz$ z?F!hez#$<%eBT8E8(Q#R0JG;L!4Z(P6cxvaEI76$dx8Bk9H*Udld8y46Kls$ttfd8 zWiByG0Fx5}UcnA=9spj44xBpRQ8zip`oG5O2UnQuZJ8^fMcZ&o z5zCpZ4g$qu`EhlwSd@oV`gIkf6YvUfi!93gK_1)NCFL(h5TTSDiFae~#`*UVrDJp) zQFCwd3G_CB-Y3v!M9ou)pj{I^!gh0+9nB0%I6Em=% zl++P8>J6bI9pEq;G}t}jje6(3vF`CMVq{K%)n&V6BG|DR`#(q-OSEqaEw|g51arH9 z^6$hM-)^)mj5pRlyy5!GbbM8tmPcBnos$1;{b~Ub${nevTp?xD-zqj9S88|_wPk=U zc-*vw3=@FQowzpXvzJNK!DKyEuO$p^*2*b-lQiSZ@VBrxIa{x%>gCb$tz%Wg1e=8|5{k{3upZN@aXW! sXyLSfGJmq*Z|3(zzk2m68YRD8Ns-S_RQUZU6?y;$vUuITaT%oY2mA5X^#A|> literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test index 230f2e9..d94d573 100644 --- a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test +++ b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-all.test @@ -1,5 +1,3 @@ -# REQUIRES: powerpc-registered-target - # RUN: llvm-objdump -D %p/Inputs/xcoff-section-headers.o | \ # RUN: FileCheck %s diff --git a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test index 71c5958..16f7137 100644 --- a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test +++ b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbol-description.test @@ -1,5 +1,3 @@ -# REQUIRES: powerpc-registered-target - # RUN: llvm-objdump -D %p/Inputs/xcoff-section-headers.o | \ # RUN: FileCheck --check-prefixes=COMMON,PLAIN %s diff --git a/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg b/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg new file mode 100644 index 0000000..0913324 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/XCOFF/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'PowerPC' in config.root.targets: + config.unsupported = True diff --git a/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test b/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test new file mode 100644 index 0000000..bb4a002 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/XCOFF/print-linenumber.test @@ -0,0 +1,50 @@ +# Test that the `llvm-objdump -l` can print correct line numbers. + +# RUN: llvm-objdump -d -l %p/Inputs/basic32.o | FileCheck %s --check-prefix=LINES32 +# RUN: llvm-objdump -d -l %p/Inputs/basic64.o | FileCheck %s --check-prefix=LINES64 + +## basic32.o Compiled with IBM XL C/C++ for AIX, V16.1.1.0 +## Compiler command: xlc basic.c -c -qdbgfmt=dwarf -g -q32 -o basic32.o +## +## basic64.o Compiled with IBM XL C/C++ for AIX, V16.1.1.0 +## Compiler command: xlc basic.c -c -qdbgfmt=dwarf -g -q64 -o basic64.o +## +## basic.c: +## int main(void) +## { +## return 0; +## } + +# LINES32: Inputs/basic32.o: file format aixcoff-rs6000 +# LINES32: Disassembly of section .text: +# LINES32: 00000000 <.text>: +# LINES32: ; main(): +# LINES32-NEXT: ; /basic.c:1 +# LINES32-NEXT: 0: 38 60 00 00 li 3, 0 +# LINES32-NEXT: ; /basic.c:3 +# LINES32-NEXT: 4: 48 00 00 04 b 0x8 +# LINES32-NEXT: ; /basic.c:4 +# LINES32-NEXT: 8: 4e 80 00 20 blr +# LINES32-NEXT: c: 00 00 00 00 +# LINES32-NEXT: 10: 00 00 20 40 +# LINES32-NEXT: 14: 00 00 00 01 +# LINES32-NEXT: 18: 00 00 00 0c +# LINES32-NEXT: 1c: 00 04 6d 61 +# LINES32-NEXT: 20: 69 6e 00 00 xori 14, 11, 0 + +# LINES64: Inputs/basic64.o: file format aix5coff64-rs6000 +# LINES64: Disassembly of section .text: +# LINES64: 0000000000000000 <.main>: +# LINES64: ; main(): +# LINES64-NEXT: ; /basic.c:1 +# LINES64-NEXT: 0: 38 60 00 00 li 3, 0 +# LINES64-NEXT: ; /basic.c:3 +# LINES64-NEXT: 4: 48 00 00 04 b 0x8 +# LINES64-NEXT: ; /basic.c:4 +# LINES64-NEXT: 8: 4e 80 00 20 blr +# LINES64-NEXT: c: 00 00 00 00 +# LINES64-NEXT: 10: 00 00 20 40 +# LINES64-NEXT: 14: 00 00 00 01 +# LINES64-NEXT: 18: 00 00 00 0c +# LINES64-NEXT: 1c: 00 04 6d 61 +# LINES64-NEXT: 20: 69 6e 00 00 xori 14, 11, 0 diff --git a/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test b/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test index 2ddf97c..087c644 100644 --- a/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test +++ b/llvm/test/tools/llvm-objdump/XCOFF/print-reloc.test @@ -1,5 +1,3 @@ -# REQUIRES: powerpc-registered-target - # RUN: llvm-objdump -r %p/Inputs/xcoff-section-headers.o | \ # RUN: FileCheck --match-full-lines --strict-whitespace %s -- 2.7.4