diff options
author | Keno Fischer <kfischer@college.harvard.edu> | 2015-05-30 19:44:53 +0000 |
---|---|---|
committer | Keno Fischer <kfischer@college.harvard.edu> | 2015-05-30 19:44:53 +0000 |
commit | 281b6941cfc896f5d675c21d1585b7074d9585d3 (patch) | |
tree | c703889c3ac49c5aa132431a71ef94f66321c54c | |
parent | e00d651071326111da62344c9468dbd2312ff19b (diff) | |
download | bcm5719-llvm-281b6941cfc896f5d675c21d1585b7074d9585d3.tar.gz bcm5719-llvm-281b6941cfc896f5d675c21d1585b7074d9585d3.zip |
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
llvm-svn: 238663
-rw-r--r-- | llvm/include/llvm/Object/MachO.h | 1 | ||||
-rw-r--r-- | llvm/include/llvm/Object/RelocVisitor.h | 31 | ||||
-rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 5 | ||||
-rw-r--r-- | llvm/test/DebugInfo/Inputs/test-multiple-macho.o | bin | 0 -> 2452 bytes | |||
-rw-r--r-- | llvm/test/DebugInfo/Inputs/test-simple-macho.o | bin | 0 -> 1944 bytes | |||
-rw-r--r-- | llvm/test/DebugInfo/debuglineinfo-macho.test | 7 | ||||
-rw-r--r-- | llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp | 9 |
7 files changed, 51 insertions, 2 deletions
diff --git a/llvm/include/llvm/Object/MachO.h b/llvm/include/llvm/Object/MachO.h index 0a9b62c9055..0fe327d6adc 100644 --- a/llvm/include/llvm/Object/MachO.h +++ b/llvm/include/llvm/Object/MachO.h @@ -246,6 +246,7 @@ public: SmallVectorImpl<char> &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/llvm/include/llvm/Object/RelocVisitor.h b/llvm/include/llvm/Object/RelocVisitor.h index 91eafd55ad7..02ffda5642d 100644 --- a/llvm/include/llvm/Object/RelocVisitor.h +++ b/llvm/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<COFFObjectFile>(ObjToVisit)) return visitCOFF(RelocType, R, Value); + if (isa<MachOObjectFile>(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<ELF32LEObjectFile>(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<MachOObjectFile>(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<<Length; + return RelocToApply(Value, Length); + } }; } diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 79f81006498..439dceb323b 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -1004,6 +1004,11 @@ std::error_code MachOObjectFile::getRelocationHidden(DataRefImpl Rel, return object_error::success; } +uint8_t MachOObjectFile::getRelocationLength(DataRefImpl Rel) const { + MachO::any_relocation_info RE = getRelocation(Rel); + return getAnyRelocationLength(RE); +} + // // guessLibraryShortName() is passed a name of a dynamic library and returns a // guess on what the short name is. Then name is returned as a substring of the diff --git a/llvm/test/DebugInfo/Inputs/test-multiple-macho.o b/llvm/test/DebugInfo/Inputs/test-multiple-macho.o Binary files differnew file mode 100644 index 00000000000..428a1af6826 --- /dev/null +++ b/llvm/test/DebugInfo/Inputs/test-multiple-macho.o diff --git a/llvm/test/DebugInfo/Inputs/test-simple-macho.o b/llvm/test/DebugInfo/Inputs/test-simple-macho.o Binary files differnew file mode 100644 index 00000000000..8ae4154626c --- /dev/null +++ b/llvm/test/DebugInfo/Inputs/test-simple-macho.o diff --git a/llvm/test/DebugInfo/debuglineinfo-macho.test b/llvm/test/DebugInfo/debuglineinfo-macho.test new file mode 100644 index 00000000000..a8dfe3c3256 --- /dev/null +++ b/llvm/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/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp b/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp index e87f1e2d4c1..defe98ae0f4 100644 --- a/llvm/tools/llvm-rtdyld/llvm-rtdyld.cpp +++ b/llvm/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(); } |