From dbdf667725714114182c2161d05e2038f8bdbc59 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Sat, 30 May 2015 19:44:53 +0000 Subject: [PATCH] Add RelocVisitor support for MachO This commit adds partial support for MachO relocations to RelocVisitor. A simple test case is added to show that relocations are indeed being applied and that using llvm-dwarfdump on MachO files no longer errors. Correctness is not yet tested, due to an unrelated bug in DebugInfo, which will be fixed with appropriate testcase in a followup commit. Differential Revision: http://reviews.llvm.org/D8148 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238663 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/MachO.h | 1 + include/llvm/Object/RelocVisitor.h | 31 ++++++++++++++++++++ lib/Object/MachOObjectFile.cpp | 5 ++++ test/DebugInfo/Inputs/test-multiple-macho.o | Bin 0 -> 2452 bytes test/DebugInfo/Inputs/test-simple-macho.o | Bin 0 -> 1944 bytes test/DebugInfo/debuglineinfo-macho.test | 7 +++++ tools/llvm-rtdyld/llvm-rtdyld.cpp | 9 ++++-- 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/DebugInfo/Inputs/test-multiple-macho.o create mode 100644 test/DebugInfo/Inputs/test-simple-macho.o create mode 100644 test/DebugInfo/debuglineinfo-macho.test diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 0a9b62c9055..0fe327d6adc 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -246,6 +246,7 @@ public: SmallVectorImpl &Result) const override; std::error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const override; + uint8_t getRelocationLength(DataRefImpl Rel) const; // MachO specific. std::error_code getLibraryShortNameByIndex(unsigned Index, StringRef &) const; diff --git a/include/llvm/Object/RelocVisitor.h b/include/llvm/Object/RelocVisitor.h index 91eafd55ad7..02ffda5642d 100644 --- a/include/llvm/Object/RelocVisitor.h +++ b/include/llvm/Object/RelocVisitor.h @@ -19,9 +19,11 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Object/COFF.h" #include "llvm/Object/ELFObjectFile.h" +#include "llvm/Object/MachO.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ELF.h" +#include "llvm/Support/MachO.h" #include "llvm/Support/raw_ostream.h" namespace llvm { @@ -52,6 +54,8 @@ public: return visitELF(RelocType, R, Value); if (isa(ObjToVisit)) return visitCOFF(RelocType, R, Value); + if (isa(ObjToVisit)) + return visitMachO(RelocType, R, Value); HasError = true; return RelocToApply(); @@ -221,6 +225,20 @@ private: return RelocToApply(); } + RelocToApply visitMachO(uint32_t RelocType, RelocationRef R, uint64_t Value) { + switch (ObjToVisit.getArch()) { + default: break; + case Triple::x86_64: + switch (RelocType) { + default: break; + case MachO::X86_64_RELOC_UNSIGNED: + return visitMACHO_X86_64_UNSIGNED(R, Value); + } + } + HasError = true; + return RelocToApply(); + } + int64_t getELFAddend32LE(RelocationRef R) { const ELF32LEObjectFile *Obj = cast(R.getObjectFile()); DataRefImpl DRI = R.getRawDataRefImpl(); @@ -252,6 +270,12 @@ private: Obj->getRelocationAddend(DRI, Addend); return Addend; } + + uint8_t getLengthMachO64(RelocationRef R) { + const MachOObjectFile *Obj = cast(R.getObjectFile()); + return Obj->getRelocationLength(R.getRawDataRefImpl()); + } + /// Operations /// 386-ELF @@ -413,6 +437,13 @@ private: RelocToApply visitCOFF_AMD64_ADDR64(RelocationRef R, uint64_t Value) { return RelocToApply(Value, /*Width=*/8); } + + // X86_64 MachO + RelocToApply visitMACHO_X86_64_UNSIGNED(RelocationRef R, uint64_t Value) { + uint8_t Length = getLengthMachO64(R); + Length = 1<L=k5!;_4LmimJJSO`r%Xc>XT@cHA7{ zn(HlF)`hd(*Ehuv9<-!KJoh0YUOJ8b6I0*)I#;ZfDsCg#(Eon7Wz)9cZ3>>Klpwki z&ROy~r}aWoj~r|QJS*`xA&)@EKAHu06Ni#;-OC4>U!H0H-n`jr?kwI-9m9zP`p&Jk zpZZ}L2rvBl*Ug<~zV$GEKi^`+Px7tByDQn$v5z#q_q;Aq}GY&Cw+l<5(Ofxobs%s`a(6)Ht-sh%j7$y))Wqe^W4X0XjD_-Ws?917y z%yWLV?p;069pl`YLcIp3f_>G#UanLN<#J=~`I;65->Lb9H(mdNTk{>ysnSZNLPZ<0 z&ZF!3WYf&W=^4(RJB@i1%oJ1cd#vrc7Liq8Ox!zT_(-n%dk-yadVj!oJ)jli*$o ze6>T5p}QSn2ovx4}=@Zt>kt<1K#=5|}+6HO=69~-Za z1?M05@rj=nKYkXP2Kbd>$cdlivj^{e_#k}jqR3Ms`APG-eol}%(K8|;v>l&4O2IKa Z7ykdldPqEFJr^!mLC;y-coz2|(SOhRD24z4 literal 0 HcmV?d00001 diff --git a/test/DebugInfo/Inputs/test-simple-macho.o b/test/DebugInfo/Inputs/test-simple-macho.o new file mode 100644 index 0000000000000000000000000000000000000000..8ae4154626c3629584fb62e99d7d9820a417317b GIT binary patch literal 1944 zcmb7E%}>-&5TCZY3tFfPYa&FWdw}@8*~E_n8iWW4hJ)cdy5!ki3RHI6we2DpP4Hsa z8y>uP_u|Q`XHTB==s#fM#l)i#6=&M%vXmvjB=df6rZc}c@6CJt{QJkhCICqR98hDZ zUua09qI9CpkiCbL<>13ljtOn#1kzT{6T&lAJT?%7m>8Uy*tWx&$`j(-v1|<1!Wcp! z=8Sx0L73LO9oPfY{bNJ5kdWs-dp4QuAr{3YGXw!4pPtV<#xn8m|7P2d&R8G~^rPBA5=YCBj(^8`kIO z)`H>gKEK2B>E&|K5SCsdx?TMU`EGJK`_~un+4)EQhNI{Ag7@3Se2@3tZ(V(5y%6Pl z8{vC>Kt6A^+;G32nC}kP_hDbYf?dM8JW;WpnAV&SqXV4kLz26f4xM=K=pV4M=lwGl z#k_;v2oj?2H_Lo|%$H_9HUZz`VmK$Hb58mW%^xYf19gqp-#~0eo8Iv~)Ow+#;Nz%w zA80-~T>Vyk{-^qD_Tv;L1b>BQpREN>F-3PB6%|ms>10S#<1|WRI4bh1XAf!?#HMi` zkAc)Cb!(}(q9sq9)Y_zW?3J8BXM3WrL(zKF8|vB4k<=~xw<>Xv*)@{Fa=Jj#dR3Ly z=|Pp@jL*KQwc?5rZ(IV`EaBtG1Wy-^)asMs%F&991xSS=KE(90;kc%4rLSbJXR_&Y zo>Q@w&TnTA_2eophUD}meYI#ixngm-blLSG=NYb-yK8!*rt2A&;lR9YgK2r7!|-_j zaM%RG7F3eJ7u?LMyRKeBpMO}07bpOwK9}rh?iR{nV`$yuM213_Sb_v%9J@;g36Nb| zSFa*cdnlG#7d~{Hk_3UfuT_oq=@>{WNh#UV)VzTllup;>{a-40Ym4&%`nBXs`F3mg bJTGDlh9^!l(vgsj;3JiDjD}DI9W%gxv<1pF literal 0 HcmV?d00001 diff --git a/test/DebugInfo/debuglineinfo-macho.test b/test/DebugInfo/debuglineinfo-macho.test new file mode 100644 index 00000000000..a8dfe3c3256 --- /dev/null +++ b/test/DebugInfo/debuglineinfo-macho.test @@ -0,0 +1,7 @@ +# Check that relocations get applied +RUN: llvm-dwarfdump %p/Inputs/test-simple-macho.o | FileCheck %s +RUN: llvm-dwarfdump %p/Inputs/test-multiple-macho.o | FileCheck %s +RUN: llvm-rtdyld -printline %p/Inputs/test-multiple-macho.o | FileCheck %s +RUN: llvm-rtdyld -printobjline %p/Inputs/test-multiple-macho.o | FileCheck %s + +CHECK-NOT: error: failed to compute relocation: X86_64_RELOC_UNSIGNED diff --git a/tools/llvm-rtdyld/llvm-rtdyld.cpp b/tools/llvm-rtdyld/llvm-rtdyld.cpp index e87f1e2d4c1..defe98ae0f4 100644 --- a/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/tools/llvm-rtdyld/llvm-rtdyld.cpp @@ -47,6 +47,7 @@ InputFileList(cl::Positional, cl::ZeroOrMore, enum ActionType { AC_Execute, + AC_PrintObjectLineInfo, AC_PrintLineInfo, AC_PrintDebugLineInfo, AC_Verify @@ -61,6 +62,8 @@ Action(cl::desc("Action to perform:"), "Load, link, and print line information for each function."), clEnumValN(AC_PrintDebugLineInfo, "printdebugline", "Load, link, and print line information for each function using the debug object"), + clEnumValN(AC_PrintObjectLineInfo, "printobjline", + "Like -printlineinfo but does not load the object first"), clEnumValN(AC_Verify, "verify", "Load, link and verify the resulting memory image."), clEnumValEnd)); @@ -622,9 +625,11 @@ int main(int argc, char **argv) { case AC_Execute: return executeInput(); case AC_PrintDebugLineInfo: - return printLineInfoForInput(true,true); + return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */ true); case AC_PrintLineInfo: - return printLineInfoForInput(true,false); + return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */false); + case AC_PrintObjectLineInfo: + return printLineInfoForInput(/* LoadObjects */false,/* UseDebugObj */false); case AC_Verify: return linkAndVerify(); } -- 2.34.1