From 07cc5a8df9edd94de7390607b0664cf83820089a Mon Sep 17 00:00:00 2001 From: David Carlier Date: Mon, 10 Sep 2018 05:00:43 +0000 Subject: [PATCH] [Xray] tooling allow MachO format support Getting writable xray __DATA sections from MachO as well. Reviewers: dberris Reviewed By: dberris Differential Revision: https://reviews.llvm.org/D51758 llvm-svn: 341772 --- llvm/lib/XRay/InstrumentationMap.cpp | 8 ++++---- .../tools/llvm-xray/X86/Inputs/instr-map-mach.o | Bin 0 -> 3120 bytes .../llvm-xray/X86/extract-instrmap-macho.ll | 9 +++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 llvm/test/tools/llvm-xray/X86/Inputs/instr-map-mach.o create mode 100644 llvm/test/tools/llvm-xray/X86/extract-instrmap-macho.ll diff --git a/llvm/lib/XRay/InstrumentationMap.cpp b/llvm/lib/XRay/InstrumentationMap.cpp index a7d6600b0d8a..84317708d3f4 100644 --- a/llvm/lib/XRay/InstrumentationMap.cpp +++ b/llvm/lib/XRay/InstrumentationMap.cpp @@ -47,18 +47,18 @@ Optional InstrumentationMap::getFunctionAddr(int32_t FuncId) const { } static Error -loadELF64(StringRef Filename, object::OwningBinary &ObjFile, +loadObj(StringRef Filename, object::OwningBinary &ObjFile, InstrumentationMap::SledContainer &Sleds, InstrumentationMap::FunctionAddressMap &FunctionAddresses, InstrumentationMap::FunctionAddressReverseMap &FunctionIds) { InstrumentationMap Map; // Find the section named "xray_instr_map". - if (!ObjFile.getBinary()->isELF() || + if ((!ObjFile.getBinary()->isELF() && !ObjFile.getBinary()->isMachO()) || !(ObjFile.getBinary()->getArch() == Triple::x86_64 || ObjFile.getBinary()->getArch() == Triple::ppc64le)) return make_error( - "File format not supported (only does ELF little endian 64-bit).", + "File format not supported (only does ELF and Mach-O little endian 64-bit).", std::make_error_code(std::errc::not_supported)); StringRef Contents = ""; @@ -191,7 +191,7 @@ llvm::xray::loadInstrumentationMap(StringRef Filename) { if (auto E = loadYAML(Fd, FileSize, Filename, Map.Sleds, Map.FunctionAddresses, Map.FunctionIds)) return std::move(E); - } else if (auto E = loadELF64(Filename, *ObjectFileOrError, Map.Sleds, + } else if (auto E = loadObj(Filename, *ObjectFileOrError, Map.Sleds, Map.FunctionAddresses, Map.FunctionIds)) { return std::move(E); } diff --git a/llvm/test/tools/llvm-xray/X86/Inputs/instr-map-mach.o b/llvm/test/tools/llvm-xray/X86/Inputs/instr-map-mach.o new file mode 100644 index 0000000000000000000000000000000000000000..44614fec3215d5786b9b72b4a1bbe43e0da98130 GIT binary patch literal 3120 zcma)8YiJx*6u#TWK4RNltHnnx8N@>VY)wkF306o*roBR=p|ny8;byZto85MIcG;b& zX=Gs`A`Ig~1b_O-5Al~j3JON?$HtVV;3J`kLN4GAW*~uR)s&x?>zi%RvsbZ$SrM-D*NDmBg&tt z^b0CK#Wwkbzg#vSi(A4rUrd_`Ax`)EwuEKnucm}OC_IT$$dAqebXS@}7%7n~#IlB` z4CXgXn*(*wr2uJgqC!aiUbvPM^>`d8YqPgiN+{Sv7*mM<0I&w}AbepR8^qX1lpl?~ z8-@RKevUie^NF9eY1|X$%y6f)%ANUTTFo7Og}XXPt`SYvD=?bD3FuV2QgYZb-Y% zo6gtV9l-k15}*08g@^w1Hc;baHuK$f9=Z`UaCajNuN)xn(uzgn-? z=k!HVy85CFoxmKS$>$=4<`sQ`JJ-ET-GK$}c4C*m;#eL1+In3fcjg_v>YE`+dy&ul zfFyt8ZnqR8f(*NOdlF$~48H;{PRpN9T{}w^7yItrDYjs zn)N_9H%*t)x$a+*$~jN#pTCz9ZjNiOIC@R8@`1W2T$I>Zcl58ERh)gt&}_J^fBn!S z^5VIrRcYqkjfS4Gg6{fGHg~E8`>hYnQnGiE`k(o-kpLeG@V=ej=T>pmh~joZOBc1n z#a1?A#A9~R(4N&2InB&jG*akDTGoh}z@(jNWtbOj>Qj(rbA>BfER)H_V^%t6K9MjQ zj8@DWMnX#&1*4T^3{yKiZhQZ9FYXH-G-WyL$ywVL`m)kzy_HStSCmA(N1F70S9@tI z|Eewrx6n^1J@qP3lYi=6M4|CBEHoAgMfU96H3=)~caLI}|EBY-*VX)jW5Wn14~ z|Gh_cxF&2`*{M2gYL|iCRb{8@!Px0$f3L%Cbuz~l1?*^jPMvnpUzB=?fg6#+Y8E_x)L*O3Z zJ3w0hCXm(_6n{zay}AFh-dKAWS9i|1Ta<{4kK{1P0mrbW!qERz?y;r!c~ys`rhD`3I86 zL+S5ex?wr11^7yUzZu{^4e%Xsw$a~X0lq!J{}EWfKcIg%pnogCe;nZPVR)glO9=UW z*Jl^4TvoqqnAT-d96g@Tp#K>nkrQZ+-uI-Pg<50{X>rVo6)z3S>2ptcUOJDT>_2ll zH#&-@`Fx%lWwGz5{+}kD(!|RnlN&{>w8aFz5fgTviM*967_o%7m`j@sU$pdu4viLh zdW&o`AG6}Ab^dOSTqZMiF@?$%27rR`z-(;tEl= Uqa(H@@X9EPoN1&72ji&izqqAa8vp