1*9880d681SAndroid Build Coastguard Worker //===-- llvm-rtdyld.cpp - MCJIT Testing Tool ------------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This is a testing tool for use with the MC-JIT LLVM components.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringMap.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/DIContext.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/DWARF/DWARFContext.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/RTDyldMemoryManager.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/RuntimeDyld.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ExecutionEngine/RuntimeDyldChecker.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCDisassembler/MCDisassembler.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstPrinter.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/MachO.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/SymbolSize.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DynamicLibrary.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ManagedStatic.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Memory.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MemoryBuffer.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/PrettyStackTrace.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
36*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
37*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetSelect.h"
38*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
39*9880d681SAndroid Build Coastguard Worker #include <list>
40*9880d681SAndroid Build Coastguard Worker #include <system_error>
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker using namespace llvm;
43*9880d681SAndroid Build Coastguard Worker using namespace llvm::object;
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
46*9880d681SAndroid Build Coastguard Worker InputFileList(cl::Positional, cl::ZeroOrMore,
47*9880d681SAndroid Build Coastguard Worker cl::desc("<input file>"));
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker enum ActionType {
50*9880d681SAndroid Build Coastguard Worker AC_Execute,
51*9880d681SAndroid Build Coastguard Worker AC_PrintObjectLineInfo,
52*9880d681SAndroid Build Coastguard Worker AC_PrintLineInfo,
53*9880d681SAndroid Build Coastguard Worker AC_PrintDebugLineInfo,
54*9880d681SAndroid Build Coastguard Worker AC_Verify
55*9880d681SAndroid Build Coastguard Worker };
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker static cl::opt<ActionType>
58*9880d681SAndroid Build Coastguard Worker Action(cl::desc("Action to perform:"),
59*9880d681SAndroid Build Coastguard Worker cl::init(AC_Execute),
60*9880d681SAndroid Build Coastguard Worker cl::values(clEnumValN(AC_Execute, "execute",
61*9880d681SAndroid Build Coastguard Worker "Load, link, and execute the inputs."),
62*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_PrintLineInfo, "printline",
63*9880d681SAndroid Build Coastguard Worker "Load, link, and print line information for each function."),
64*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_PrintDebugLineInfo, "printdebugline",
65*9880d681SAndroid Build Coastguard Worker "Load, link, and print line information for each function using the debug object"),
66*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_PrintObjectLineInfo, "printobjline",
67*9880d681SAndroid Build Coastguard Worker "Like -printlineinfo but does not load the object first"),
68*9880d681SAndroid Build Coastguard Worker clEnumValN(AC_Verify, "verify",
69*9880d681SAndroid Build Coastguard Worker "Load, link and verify the resulting memory image."),
70*9880d681SAndroid Build Coastguard Worker clEnumValEnd));
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
73*9880d681SAndroid Build Coastguard Worker EntryPoint("entry",
74*9880d681SAndroid Build Coastguard Worker cl::desc("Function to call as entry point."),
75*9880d681SAndroid Build Coastguard Worker cl::init("_main"));
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
78*9880d681SAndroid Build Coastguard Worker Dylibs("dylib",
79*9880d681SAndroid Build Coastguard Worker cl::desc("Add library."),
80*9880d681SAndroid Build Coastguard Worker cl::ZeroOrMore);
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
83*9880d681SAndroid Build Coastguard Worker TripleName("triple", cl::desc("Target triple for disassembler"));
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker static cl::opt<std::string>
86*9880d681SAndroid Build Coastguard Worker MCPU("mcpu",
87*9880d681SAndroid Build Coastguard Worker cl::desc("Target a specific cpu type (-mcpu=help for details)"),
88*9880d681SAndroid Build Coastguard Worker cl::value_desc("cpu-name"),
89*9880d681SAndroid Build Coastguard Worker cl::init(""));
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
92*9880d681SAndroid Build Coastguard Worker CheckFiles("check",
93*9880d681SAndroid Build Coastguard Worker cl::desc("File containing RuntimeDyld verifier checks."),
94*9880d681SAndroid Build Coastguard Worker cl::ZeroOrMore);
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker static cl::opt<uint64_t>
97*9880d681SAndroid Build Coastguard Worker PreallocMemory("preallocate",
98*9880d681SAndroid Build Coastguard Worker cl::desc("Allocate memory upfront rather than on-demand"),
99*9880d681SAndroid Build Coastguard Worker cl::init(0));
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker static cl::opt<uint64_t>
102*9880d681SAndroid Build Coastguard Worker TargetAddrStart("target-addr-start",
103*9880d681SAndroid Build Coastguard Worker cl::desc("For -verify only: start of phony target address "
104*9880d681SAndroid Build Coastguard Worker "range."),
105*9880d681SAndroid Build Coastguard Worker cl::init(4096), // Start at "page 1" - no allocating at "null".
106*9880d681SAndroid Build Coastguard Worker cl::Hidden);
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker static cl::opt<uint64_t>
109*9880d681SAndroid Build Coastguard Worker TargetAddrEnd("target-addr-end",
110*9880d681SAndroid Build Coastguard Worker cl::desc("For -verify only: end of phony target address range."),
111*9880d681SAndroid Build Coastguard Worker cl::init(~0ULL),
112*9880d681SAndroid Build Coastguard Worker cl::Hidden);
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker static cl::opt<uint64_t>
115*9880d681SAndroid Build Coastguard Worker TargetSectionSep("target-section-sep",
116*9880d681SAndroid Build Coastguard Worker cl::desc("For -verify only: Separation between sections in "
117*9880d681SAndroid Build Coastguard Worker "phony target address space."),
118*9880d681SAndroid Build Coastguard Worker cl::init(0),
119*9880d681SAndroid Build Coastguard Worker cl::Hidden);
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
122*9880d681SAndroid Build Coastguard Worker SpecificSectionMappings("map-section",
123*9880d681SAndroid Build Coastguard Worker cl::desc("For -verify only: Map a section to a "
124*9880d681SAndroid Build Coastguard Worker "specific address."),
125*9880d681SAndroid Build Coastguard Worker cl::ZeroOrMore,
126*9880d681SAndroid Build Coastguard Worker cl::Hidden);
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker static cl::list<std::string>
129*9880d681SAndroid Build Coastguard Worker DummySymbolMappings("dummy-extern",
130*9880d681SAndroid Build Coastguard Worker cl::desc("For -verify only: Inject a symbol into the extern "
131*9880d681SAndroid Build Coastguard Worker "symbol table."),
132*9880d681SAndroid Build Coastguard Worker cl::ZeroOrMore,
133*9880d681SAndroid Build Coastguard Worker cl::Hidden);
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
136*9880d681SAndroid Build Coastguard Worker PrintAllocationRequests("print-alloc-requests",
137*9880d681SAndroid Build Coastguard Worker cl::desc("Print allocation requests made to the memory "
138*9880d681SAndroid Build Coastguard Worker "manager by RuntimeDyld"),
139*9880d681SAndroid Build Coastguard Worker cl::Hidden);
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker /* *** */
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker // A trivial memory manager that doesn't do anything fancy, just uses the
144*9880d681SAndroid Build Coastguard Worker // support library allocation routines directly.
145*9880d681SAndroid Build Coastguard Worker class TrivialMemoryManager : public RTDyldMemoryManager {
146*9880d681SAndroid Build Coastguard Worker public:
147*9880d681SAndroid Build Coastguard Worker SmallVector<sys::MemoryBlock, 16> FunctionMemory;
148*9880d681SAndroid Build Coastguard Worker SmallVector<sys::MemoryBlock, 16> DataMemory;
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment,
151*9880d681SAndroid Build Coastguard Worker unsigned SectionID,
152*9880d681SAndroid Build Coastguard Worker StringRef SectionName) override;
153*9880d681SAndroid Build Coastguard Worker uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment,
154*9880d681SAndroid Build Coastguard Worker unsigned SectionID, StringRef SectionName,
155*9880d681SAndroid Build Coastguard Worker bool IsReadOnly) override;
156*9880d681SAndroid Build Coastguard Worker
getPointerToNamedFunction(const std::string & Name,bool AbortOnFailure=true)157*9880d681SAndroid Build Coastguard Worker void *getPointerToNamedFunction(const std::string &Name,
158*9880d681SAndroid Build Coastguard Worker bool AbortOnFailure = true) override {
159*9880d681SAndroid Build Coastguard Worker return nullptr;
160*9880d681SAndroid Build Coastguard Worker }
161*9880d681SAndroid Build Coastguard Worker
finalizeMemory(std::string * ErrMsg)162*9880d681SAndroid Build Coastguard Worker bool finalizeMemory(std::string *ErrMsg) override { return false; }
163*9880d681SAndroid Build Coastguard Worker
addDummySymbol(const std::string & Name,uint64_t Addr)164*9880d681SAndroid Build Coastguard Worker void addDummySymbol(const std::string &Name, uint64_t Addr) {
165*9880d681SAndroid Build Coastguard Worker DummyExterns[Name] = Addr;
166*9880d681SAndroid Build Coastguard Worker }
167*9880d681SAndroid Build Coastguard Worker
findSymbol(const std::string & Name)168*9880d681SAndroid Build Coastguard Worker RuntimeDyld::SymbolInfo findSymbol(const std::string &Name) override {
169*9880d681SAndroid Build Coastguard Worker auto I = DummyExterns.find(Name);
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker if (I != DummyExterns.end())
172*9880d681SAndroid Build Coastguard Worker return RuntimeDyld::SymbolInfo(I->second, JITSymbolFlags::Exported);
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker return RTDyldMemoryManager::findSymbol(Name);
175*9880d681SAndroid Build Coastguard Worker }
176*9880d681SAndroid Build Coastguard Worker
registerEHFrames(uint8_t * Addr,uint64_t LoadAddr,size_t Size)177*9880d681SAndroid Build Coastguard Worker void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr,
178*9880d681SAndroid Build Coastguard Worker size_t Size) override {}
deregisterEHFrames(uint8_t * Addr,uint64_t LoadAddr,size_t Size)179*9880d681SAndroid Build Coastguard Worker void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr,
180*9880d681SAndroid Build Coastguard Worker size_t Size) override {}
181*9880d681SAndroid Build Coastguard Worker
preallocateSlab(uint64_t Size)182*9880d681SAndroid Build Coastguard Worker void preallocateSlab(uint64_t Size) {
183*9880d681SAndroid Build Coastguard Worker std::string Err;
184*9880d681SAndroid Build Coastguard Worker sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err);
185*9880d681SAndroid Build Coastguard Worker if (!MB.base())
186*9880d681SAndroid Build Coastguard Worker report_fatal_error("Can't allocate enough memory: " + Err);
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker PreallocSlab = MB;
189*9880d681SAndroid Build Coastguard Worker UsePreallocation = true;
190*9880d681SAndroid Build Coastguard Worker SlabSize = Size;
191*9880d681SAndroid Build Coastguard Worker }
192*9880d681SAndroid Build Coastguard Worker
allocateFromSlab(uintptr_t Size,unsigned Alignment,bool isCode)193*9880d681SAndroid Build Coastguard Worker uint8_t *allocateFromSlab(uintptr_t Size, unsigned Alignment, bool isCode) {
194*9880d681SAndroid Build Coastguard Worker Size = alignTo(Size, Alignment);
195*9880d681SAndroid Build Coastguard Worker if (CurrentSlabOffset + Size > SlabSize)
196*9880d681SAndroid Build Coastguard Worker report_fatal_error("Can't allocate enough memory. Tune --preallocate");
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker uintptr_t OldSlabOffset = CurrentSlabOffset;
199*9880d681SAndroid Build Coastguard Worker sys::MemoryBlock MB((void *)OldSlabOffset, Size);
200*9880d681SAndroid Build Coastguard Worker if (isCode)
201*9880d681SAndroid Build Coastguard Worker FunctionMemory.push_back(MB);
202*9880d681SAndroid Build Coastguard Worker else
203*9880d681SAndroid Build Coastguard Worker DataMemory.push_back(MB);
204*9880d681SAndroid Build Coastguard Worker CurrentSlabOffset += Size;
205*9880d681SAndroid Build Coastguard Worker return (uint8_t*)OldSlabOffset;
206*9880d681SAndroid Build Coastguard Worker }
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker private:
209*9880d681SAndroid Build Coastguard Worker std::map<std::string, uint64_t> DummyExterns;
210*9880d681SAndroid Build Coastguard Worker sys::MemoryBlock PreallocSlab;
211*9880d681SAndroid Build Coastguard Worker bool UsePreallocation = false;
212*9880d681SAndroid Build Coastguard Worker uintptr_t SlabSize = 0;
213*9880d681SAndroid Build Coastguard Worker uintptr_t CurrentSlabOffset = 0;
214*9880d681SAndroid Build Coastguard Worker };
215*9880d681SAndroid Build Coastguard Worker
allocateCodeSection(uintptr_t Size,unsigned Alignment,unsigned SectionID,StringRef SectionName)216*9880d681SAndroid Build Coastguard Worker uint8_t *TrivialMemoryManager::allocateCodeSection(uintptr_t Size,
217*9880d681SAndroid Build Coastguard Worker unsigned Alignment,
218*9880d681SAndroid Build Coastguard Worker unsigned SectionID,
219*9880d681SAndroid Build Coastguard Worker StringRef SectionName) {
220*9880d681SAndroid Build Coastguard Worker if (PrintAllocationRequests)
221*9880d681SAndroid Build Coastguard Worker outs() << "allocateCodeSection(Size = " << Size << ", Alignment = "
222*9880d681SAndroid Build Coastguard Worker << Alignment << ", SectionName = " << SectionName << ")\n";
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker if (UsePreallocation)
225*9880d681SAndroid Build Coastguard Worker return allocateFromSlab(Size, Alignment, true /* isCode */);
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker std::string Err;
228*9880d681SAndroid Build Coastguard Worker sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err);
229*9880d681SAndroid Build Coastguard Worker if (!MB.base())
230*9880d681SAndroid Build Coastguard Worker report_fatal_error("MemoryManager allocation failed: " + Err);
231*9880d681SAndroid Build Coastguard Worker FunctionMemory.push_back(MB);
232*9880d681SAndroid Build Coastguard Worker return (uint8_t*)MB.base();
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker
allocateDataSection(uintptr_t Size,unsigned Alignment,unsigned SectionID,StringRef SectionName,bool IsReadOnly)235*9880d681SAndroid Build Coastguard Worker uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
236*9880d681SAndroid Build Coastguard Worker unsigned Alignment,
237*9880d681SAndroid Build Coastguard Worker unsigned SectionID,
238*9880d681SAndroid Build Coastguard Worker StringRef SectionName,
239*9880d681SAndroid Build Coastguard Worker bool IsReadOnly) {
240*9880d681SAndroid Build Coastguard Worker if (PrintAllocationRequests)
241*9880d681SAndroid Build Coastguard Worker outs() << "allocateDataSection(Size = " << Size << ", Alignment = "
242*9880d681SAndroid Build Coastguard Worker << Alignment << ", SectionName = " << SectionName << ")\n";
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker if (UsePreallocation)
245*9880d681SAndroid Build Coastguard Worker return allocateFromSlab(Size, Alignment, false /* isCode */);
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker std::string Err;
248*9880d681SAndroid Build Coastguard Worker sys::MemoryBlock MB = sys::Memory::AllocateRWX(Size, nullptr, &Err);
249*9880d681SAndroid Build Coastguard Worker if (!MB.base())
250*9880d681SAndroid Build Coastguard Worker report_fatal_error("MemoryManager allocation failed: " + Err);
251*9880d681SAndroid Build Coastguard Worker DataMemory.push_back(MB);
252*9880d681SAndroid Build Coastguard Worker return (uint8_t*)MB.base();
253*9880d681SAndroid Build Coastguard Worker }
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker static const char *ProgramName;
256*9880d681SAndroid Build Coastguard Worker
ErrorAndExit(const Twine & Msg)257*9880d681SAndroid Build Coastguard Worker static void ErrorAndExit(const Twine &Msg) {
258*9880d681SAndroid Build Coastguard Worker errs() << ProgramName << ": error: " << Msg << "\n";
259*9880d681SAndroid Build Coastguard Worker exit(1);
260*9880d681SAndroid Build Coastguard Worker }
261*9880d681SAndroid Build Coastguard Worker
loadDylibs()262*9880d681SAndroid Build Coastguard Worker static void loadDylibs() {
263*9880d681SAndroid Build Coastguard Worker for (const std::string &Dylib : Dylibs) {
264*9880d681SAndroid Build Coastguard Worker if (!sys::fs::is_regular_file(Dylib))
265*9880d681SAndroid Build Coastguard Worker report_fatal_error("Dylib not found: '" + Dylib + "'.");
266*9880d681SAndroid Build Coastguard Worker std::string ErrMsg;
267*9880d681SAndroid Build Coastguard Worker if (sys::DynamicLibrary::LoadLibraryPermanently(Dylib.c_str(), &ErrMsg))
268*9880d681SAndroid Build Coastguard Worker report_fatal_error("Error loading '" + Dylib + "': " + ErrMsg);
269*9880d681SAndroid Build Coastguard Worker }
270*9880d681SAndroid Build Coastguard Worker }
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker /* *** */
273*9880d681SAndroid Build Coastguard Worker
printLineInfoForInput(bool LoadObjects,bool UseDebugObj)274*9880d681SAndroid Build Coastguard Worker static int printLineInfoForInput(bool LoadObjects, bool UseDebugObj) {
275*9880d681SAndroid Build Coastguard Worker assert(LoadObjects || !UseDebugObj);
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker // Load any dylibs requested on the command line.
278*9880d681SAndroid Build Coastguard Worker loadDylibs();
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker // If we don't have any input files, read from stdin.
281*9880d681SAndroid Build Coastguard Worker if (!InputFileList.size())
282*9880d681SAndroid Build Coastguard Worker InputFileList.push_back("-");
283*9880d681SAndroid Build Coastguard Worker for (auto &File : InputFileList) {
284*9880d681SAndroid Build Coastguard Worker // Instantiate a dynamic linker.
285*9880d681SAndroid Build Coastguard Worker TrivialMemoryManager MemMgr;
286*9880d681SAndroid Build Coastguard Worker RuntimeDyld Dyld(MemMgr, MemMgr);
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Worker // Load the input memory buffer.
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer =
291*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getFileOrSTDIN(File);
292*9880d681SAndroid Build Coastguard Worker if (std::error_code EC = InputBuffer.getError())
293*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to read input: '" + EC.message() + "'");
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<ObjectFile>> MaybeObj(
296*9880d681SAndroid Build Coastguard Worker ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef()));
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker if (!MaybeObj) {
299*9880d681SAndroid Build Coastguard Worker std::string Buf;
300*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(Buf);
301*9880d681SAndroid Build Coastguard Worker logAllUnhandledErrors(MaybeObj.takeError(), OS, "");
302*9880d681SAndroid Build Coastguard Worker OS.flush();
303*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to create object file: '" + Buf + "'");
304*9880d681SAndroid Build Coastguard Worker }
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker ObjectFile &Obj = **MaybeObj;
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker OwningBinary<ObjectFile> DebugObj;
309*9880d681SAndroid Build Coastguard Worker std::unique_ptr<RuntimeDyld::LoadedObjectInfo> LoadedObjInfo = nullptr;
310*9880d681SAndroid Build Coastguard Worker ObjectFile *SymbolObj = &Obj;
311*9880d681SAndroid Build Coastguard Worker if (LoadObjects) {
312*9880d681SAndroid Build Coastguard Worker // Load the object file
313*9880d681SAndroid Build Coastguard Worker LoadedObjInfo =
314*9880d681SAndroid Build Coastguard Worker Dyld.loadObject(Obj);
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker if (Dyld.hasError())
317*9880d681SAndroid Build Coastguard Worker ErrorAndExit(Dyld.getErrorString());
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker // Resolve all the relocations we can.
320*9880d681SAndroid Build Coastguard Worker Dyld.resolveRelocations();
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker if (UseDebugObj) {
323*9880d681SAndroid Build Coastguard Worker DebugObj = LoadedObjInfo->getObjectForDebug(Obj);
324*9880d681SAndroid Build Coastguard Worker SymbolObj = DebugObj.getBinary();
325*9880d681SAndroid Build Coastguard Worker LoadedObjInfo.reset();
326*9880d681SAndroid Build Coastguard Worker }
327*9880d681SAndroid Build Coastguard Worker }
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker std::unique_ptr<DIContext> Context(
330*9880d681SAndroid Build Coastguard Worker new DWARFContextInMemory(*SymbolObj,LoadedObjInfo.get()));
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker std::vector<std::pair<SymbolRef, uint64_t>> SymAddr =
333*9880d681SAndroid Build Coastguard Worker object::computeSymbolSizes(*SymbolObj);
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker // Use symbol info to iterate functions in the object.
336*9880d681SAndroid Build Coastguard Worker for (const auto &P : SymAddr) {
337*9880d681SAndroid Build Coastguard Worker object::SymbolRef Sym = P.first;
338*9880d681SAndroid Build Coastguard Worker Expected<SymbolRef::Type> TypeOrErr = Sym.getType();
339*9880d681SAndroid Build Coastguard Worker if (!TypeOrErr) {
340*9880d681SAndroid Build Coastguard Worker // TODO: Actually report errors helpfully.
341*9880d681SAndroid Build Coastguard Worker consumeError(TypeOrErr.takeError());
342*9880d681SAndroid Build Coastguard Worker continue;
343*9880d681SAndroid Build Coastguard Worker }
344*9880d681SAndroid Build Coastguard Worker SymbolRef::Type Type = *TypeOrErr;
345*9880d681SAndroid Build Coastguard Worker if (Type == object::SymbolRef::ST_Function) {
346*9880d681SAndroid Build Coastguard Worker Expected<StringRef> Name = Sym.getName();
347*9880d681SAndroid Build Coastguard Worker if (!Name) {
348*9880d681SAndroid Build Coastguard Worker // TODO: Actually report errors helpfully.
349*9880d681SAndroid Build Coastguard Worker consumeError(Name.takeError());
350*9880d681SAndroid Build Coastguard Worker continue;
351*9880d681SAndroid Build Coastguard Worker }
352*9880d681SAndroid Build Coastguard Worker Expected<uint64_t> AddrOrErr = Sym.getAddress();
353*9880d681SAndroid Build Coastguard Worker if (!AddrOrErr) {
354*9880d681SAndroid Build Coastguard Worker // TODO: Actually report errors helpfully.
355*9880d681SAndroid Build Coastguard Worker consumeError(AddrOrErr.takeError());
356*9880d681SAndroid Build Coastguard Worker continue;
357*9880d681SAndroid Build Coastguard Worker }
358*9880d681SAndroid Build Coastguard Worker uint64_t Addr = *AddrOrErr;
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker uint64_t Size = P.second;
361*9880d681SAndroid Build Coastguard Worker // If we're not using the debug object, compute the address of the
362*9880d681SAndroid Build Coastguard Worker // symbol in memory (rather than that in the unrelocated object file)
363*9880d681SAndroid Build Coastguard Worker // and use that to query the DWARFContext.
364*9880d681SAndroid Build Coastguard Worker if (!UseDebugObj && LoadObjects) {
365*9880d681SAndroid Build Coastguard Worker auto SecOrErr = Sym.getSection();
366*9880d681SAndroid Build Coastguard Worker if (!SecOrErr) {
367*9880d681SAndroid Build Coastguard Worker // TODO: Actually report errors helpfully.
368*9880d681SAndroid Build Coastguard Worker consumeError(SecOrErr.takeError());
369*9880d681SAndroid Build Coastguard Worker continue;
370*9880d681SAndroid Build Coastguard Worker }
371*9880d681SAndroid Build Coastguard Worker object::section_iterator Sec = *SecOrErr;
372*9880d681SAndroid Build Coastguard Worker StringRef SecName;
373*9880d681SAndroid Build Coastguard Worker Sec->getName(SecName);
374*9880d681SAndroid Build Coastguard Worker uint64_t SectionLoadAddress =
375*9880d681SAndroid Build Coastguard Worker LoadedObjInfo->getSectionLoadAddress(*Sec);
376*9880d681SAndroid Build Coastguard Worker if (SectionLoadAddress != 0)
377*9880d681SAndroid Build Coastguard Worker Addr += SectionLoadAddress - Sec->getAddress();
378*9880d681SAndroid Build Coastguard Worker }
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker outs() << "Function: " << *Name << ", Size = " << Size
381*9880d681SAndroid Build Coastguard Worker << ", Addr = " << Addr << "\n";
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Worker DILineInfoTable Lines = Context->getLineInfoForAddressRange(Addr, Size);
384*9880d681SAndroid Build Coastguard Worker for (auto &D : Lines) {
385*9880d681SAndroid Build Coastguard Worker outs() << " Line info @ " << D.first - Addr << ": "
386*9880d681SAndroid Build Coastguard Worker << D.second.FileName << ", line:" << D.second.Line << "\n";
387*9880d681SAndroid Build Coastguard Worker }
388*9880d681SAndroid Build Coastguard Worker }
389*9880d681SAndroid Build Coastguard Worker }
390*9880d681SAndroid Build Coastguard Worker }
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker return 0;
393*9880d681SAndroid Build Coastguard Worker }
394*9880d681SAndroid Build Coastguard Worker
doPreallocation(TrivialMemoryManager & MemMgr)395*9880d681SAndroid Build Coastguard Worker static void doPreallocation(TrivialMemoryManager &MemMgr) {
396*9880d681SAndroid Build Coastguard Worker // Allocate a slab of memory upfront, if required. This is used if
397*9880d681SAndroid Build Coastguard Worker // we want to test small code models.
398*9880d681SAndroid Build Coastguard Worker if (static_cast<intptr_t>(PreallocMemory) < 0)
399*9880d681SAndroid Build Coastguard Worker report_fatal_error("Pre-allocated bytes of memory must be a positive integer.");
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker // FIXME: Limit the amount of memory that can be preallocated?
402*9880d681SAndroid Build Coastguard Worker if (PreallocMemory != 0)
403*9880d681SAndroid Build Coastguard Worker MemMgr.preallocateSlab(PreallocMemory);
404*9880d681SAndroid Build Coastguard Worker }
405*9880d681SAndroid Build Coastguard Worker
executeInput()406*9880d681SAndroid Build Coastguard Worker static int executeInput() {
407*9880d681SAndroid Build Coastguard Worker // Load any dylibs requested on the command line.
408*9880d681SAndroid Build Coastguard Worker loadDylibs();
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Worker // Instantiate a dynamic linker.
411*9880d681SAndroid Build Coastguard Worker TrivialMemoryManager MemMgr;
412*9880d681SAndroid Build Coastguard Worker doPreallocation(MemMgr);
413*9880d681SAndroid Build Coastguard Worker RuntimeDyld Dyld(MemMgr, MemMgr);
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker // If we don't have any input files, read from stdin.
416*9880d681SAndroid Build Coastguard Worker if (!InputFileList.size())
417*9880d681SAndroid Build Coastguard Worker InputFileList.push_back("-");
418*9880d681SAndroid Build Coastguard Worker for (auto &File : InputFileList) {
419*9880d681SAndroid Build Coastguard Worker // Load the input memory buffer.
420*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer =
421*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getFileOrSTDIN(File);
422*9880d681SAndroid Build Coastguard Worker if (std::error_code EC = InputBuffer.getError())
423*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to read input: '" + EC.message() + "'");
424*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<ObjectFile>> MaybeObj(
425*9880d681SAndroid Build Coastguard Worker ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef()));
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker if (!MaybeObj) {
428*9880d681SAndroid Build Coastguard Worker std::string Buf;
429*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(Buf);
430*9880d681SAndroid Build Coastguard Worker logAllUnhandledErrors(MaybeObj.takeError(), OS, "");
431*9880d681SAndroid Build Coastguard Worker OS.flush();
432*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to create object file: '" + Buf + "'");
433*9880d681SAndroid Build Coastguard Worker }
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Worker ObjectFile &Obj = **MaybeObj;
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Worker // Load the object file
438*9880d681SAndroid Build Coastguard Worker Dyld.loadObject(Obj);
439*9880d681SAndroid Build Coastguard Worker if (Dyld.hasError()) {
440*9880d681SAndroid Build Coastguard Worker ErrorAndExit(Dyld.getErrorString());
441*9880d681SAndroid Build Coastguard Worker }
442*9880d681SAndroid Build Coastguard Worker }
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker // Resove all the relocations we can.
445*9880d681SAndroid Build Coastguard Worker // FIXME: Error out if there are unresolved relocations.
446*9880d681SAndroid Build Coastguard Worker Dyld.resolveRelocations();
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Worker // Get the address of the entry point (_main by default).
449*9880d681SAndroid Build Coastguard Worker void *MainAddress = Dyld.getSymbolLocalAddress(EntryPoint);
450*9880d681SAndroid Build Coastguard Worker if (!MainAddress)
451*9880d681SAndroid Build Coastguard Worker ErrorAndExit("no definition for '" + EntryPoint + "'");
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Worker // Invalidate the instruction cache for each loaded function.
454*9880d681SAndroid Build Coastguard Worker for (auto &FM : MemMgr.FunctionMemory) {
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker // Make sure the memory is executable.
457*9880d681SAndroid Build Coastguard Worker // setExecutable will call InvalidateInstructionCache.
458*9880d681SAndroid Build Coastguard Worker std::string ErrorStr;
459*9880d681SAndroid Build Coastguard Worker if (!sys::Memory::setExecutable(FM, &ErrorStr))
460*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to mark function executable: '" + ErrorStr + "'");
461*9880d681SAndroid Build Coastguard Worker }
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Worker // Dispatch to _main().
464*9880d681SAndroid Build Coastguard Worker errs() << "loaded '" << EntryPoint << "' at: " << (void*)MainAddress << "\n";
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker int (*Main)(int, const char**) =
467*9880d681SAndroid Build Coastguard Worker (int(*)(int,const char**)) uintptr_t(MainAddress);
468*9880d681SAndroid Build Coastguard Worker const char **Argv = new const char*[2];
469*9880d681SAndroid Build Coastguard Worker // Use the name of the first input object module as argv[0] for the target.
470*9880d681SAndroid Build Coastguard Worker Argv[0] = InputFileList[0].c_str();
471*9880d681SAndroid Build Coastguard Worker Argv[1] = nullptr;
472*9880d681SAndroid Build Coastguard Worker return Main(1, Argv);
473*9880d681SAndroid Build Coastguard Worker }
474*9880d681SAndroid Build Coastguard Worker
checkAllExpressions(RuntimeDyldChecker & Checker)475*9880d681SAndroid Build Coastguard Worker static int checkAllExpressions(RuntimeDyldChecker &Checker) {
476*9880d681SAndroid Build Coastguard Worker for (const auto& CheckerFileName : CheckFiles) {
477*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> CheckerFileBuf =
478*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getFileOrSTDIN(CheckerFileName);
479*9880d681SAndroid Build Coastguard Worker if (std::error_code EC = CheckerFileBuf.getError())
480*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to read input '" + CheckerFileName + "': " +
481*9880d681SAndroid Build Coastguard Worker EC.message());
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Worker if (!Checker.checkAllRulesInBuffer("# rtdyld-check:",
484*9880d681SAndroid Build Coastguard Worker CheckerFileBuf.get().get()))
485*9880d681SAndroid Build Coastguard Worker ErrorAndExit("some checks in '" + CheckerFileName + "' failed");
486*9880d681SAndroid Build Coastguard Worker }
487*9880d681SAndroid Build Coastguard Worker return 0;
488*9880d681SAndroid Build Coastguard Worker }
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker static std::map<void *, uint64_t>
applySpecificSectionMappings(RuntimeDyldChecker & Checker)491*9880d681SAndroid Build Coastguard Worker applySpecificSectionMappings(RuntimeDyldChecker &Checker) {
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker std::map<void*, uint64_t> SpecificMappings;
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker for (StringRef Mapping : SpecificSectionMappings) {
496*9880d681SAndroid Build Coastguard Worker
497*9880d681SAndroid Build Coastguard Worker size_t EqualsIdx = Mapping.find_first_of("=");
498*9880d681SAndroid Build Coastguard Worker std::string SectionIDStr = Mapping.substr(0, EqualsIdx);
499*9880d681SAndroid Build Coastguard Worker size_t ComaIdx = Mapping.find_first_of(",");
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker if (ComaIdx == StringRef::npos)
502*9880d681SAndroid Build Coastguard Worker report_fatal_error("Invalid section specification '" + Mapping +
503*9880d681SAndroid Build Coastguard Worker "'. Should be '<file name>,<section name>=<addr>'");
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Worker std::string FileName = SectionIDStr.substr(0, ComaIdx);
506*9880d681SAndroid Build Coastguard Worker std::string SectionName = SectionIDStr.substr(ComaIdx + 1);
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Worker uint64_t OldAddrInt;
509*9880d681SAndroid Build Coastguard Worker std::string ErrorMsg;
510*9880d681SAndroid Build Coastguard Worker std::tie(OldAddrInt, ErrorMsg) =
511*9880d681SAndroid Build Coastguard Worker Checker.getSectionAddr(FileName, SectionName, true);
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker if (ErrorMsg != "")
514*9880d681SAndroid Build Coastguard Worker report_fatal_error(ErrorMsg);
515*9880d681SAndroid Build Coastguard Worker
516*9880d681SAndroid Build Coastguard Worker void* OldAddr = reinterpret_cast<void*>(static_cast<uintptr_t>(OldAddrInt));
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Worker std::string NewAddrStr = Mapping.substr(EqualsIdx + 1);
519*9880d681SAndroid Build Coastguard Worker uint64_t NewAddr;
520*9880d681SAndroid Build Coastguard Worker
521*9880d681SAndroid Build Coastguard Worker if (StringRef(NewAddrStr).getAsInteger(0, NewAddr))
522*9880d681SAndroid Build Coastguard Worker report_fatal_error("Invalid section address in mapping '" + Mapping +
523*9880d681SAndroid Build Coastguard Worker "'.");
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Worker Checker.getRTDyld().mapSectionAddress(OldAddr, NewAddr);
526*9880d681SAndroid Build Coastguard Worker SpecificMappings[OldAddr] = NewAddr;
527*9880d681SAndroid Build Coastguard Worker }
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Worker return SpecificMappings;
530*9880d681SAndroid Build Coastguard Worker }
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker // Scatter sections in all directions!
533*9880d681SAndroid Build Coastguard Worker // Remaps section addresses for -verify mode. The following command line options
534*9880d681SAndroid Build Coastguard Worker // can be used to customize the layout of the memory within the phony target's
535*9880d681SAndroid Build Coastguard Worker // address space:
536*9880d681SAndroid Build Coastguard Worker // -target-addr-start <s> -- Specify where the phony target addres range starts.
537*9880d681SAndroid Build Coastguard Worker // -target-addr-end <e> -- Specify where the phony target address range ends.
538*9880d681SAndroid Build Coastguard Worker // -target-section-sep <d> -- Specify how big a gap should be left between the
539*9880d681SAndroid Build Coastguard Worker // end of one section and the start of the next.
540*9880d681SAndroid Build Coastguard Worker // Defaults to zero. Set to something big
541*9880d681SAndroid Build Coastguard Worker // (e.g. 1 << 32) to stress-test stubs, GOTs, etc.
542*9880d681SAndroid Build Coastguard Worker //
remapSectionsAndSymbols(const llvm::Triple & TargetTriple,TrivialMemoryManager & MemMgr,RuntimeDyldChecker & Checker)543*9880d681SAndroid Build Coastguard Worker static void remapSectionsAndSymbols(const llvm::Triple &TargetTriple,
544*9880d681SAndroid Build Coastguard Worker TrivialMemoryManager &MemMgr,
545*9880d681SAndroid Build Coastguard Worker RuntimeDyldChecker &Checker) {
546*9880d681SAndroid Build Coastguard Worker
547*9880d681SAndroid Build Coastguard Worker // Set up a work list (section addr/size pairs).
548*9880d681SAndroid Build Coastguard Worker typedef std::list<std::pair<void*, uint64_t>> WorklistT;
549*9880d681SAndroid Build Coastguard Worker WorklistT Worklist;
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Worker for (const auto& CodeSection : MemMgr.FunctionMemory)
552*9880d681SAndroid Build Coastguard Worker Worklist.push_back(std::make_pair(CodeSection.base(), CodeSection.size()));
553*9880d681SAndroid Build Coastguard Worker for (const auto& DataSection : MemMgr.DataMemory)
554*9880d681SAndroid Build Coastguard Worker Worklist.push_back(std::make_pair(DataSection.base(), DataSection.size()));
555*9880d681SAndroid Build Coastguard Worker
556*9880d681SAndroid Build Coastguard Worker // Apply any section-specific mappings that were requested on the command
557*9880d681SAndroid Build Coastguard Worker // line.
558*9880d681SAndroid Build Coastguard Worker typedef std::map<void*, uint64_t> AppliedMappingsT;
559*9880d681SAndroid Build Coastguard Worker AppliedMappingsT AppliedMappings = applySpecificSectionMappings(Checker);
560*9880d681SAndroid Build Coastguard Worker
561*9880d681SAndroid Build Coastguard Worker // Keep an "already allocated" mapping of section target addresses to sizes.
562*9880d681SAndroid Build Coastguard Worker // Sections whose address mappings aren't specified on the command line will
563*9880d681SAndroid Build Coastguard Worker // allocated around the explicitly mapped sections while maintaining the
564*9880d681SAndroid Build Coastguard Worker // minimum separation.
565*9880d681SAndroid Build Coastguard Worker std::map<uint64_t, uint64_t> AlreadyAllocated;
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Worker // Move the previously applied mappings into the already-allocated map.
568*9880d681SAndroid Build Coastguard Worker for (WorklistT::iterator I = Worklist.begin(), E = Worklist.end();
569*9880d681SAndroid Build Coastguard Worker I != E;) {
570*9880d681SAndroid Build Coastguard Worker WorklistT::iterator Tmp = I;
571*9880d681SAndroid Build Coastguard Worker ++I;
572*9880d681SAndroid Build Coastguard Worker AppliedMappingsT::iterator AI = AppliedMappings.find(Tmp->first);
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker if (AI != AppliedMappings.end()) {
575*9880d681SAndroid Build Coastguard Worker AlreadyAllocated[AI->second] = Tmp->second;
576*9880d681SAndroid Build Coastguard Worker Worklist.erase(Tmp);
577*9880d681SAndroid Build Coastguard Worker }
578*9880d681SAndroid Build Coastguard Worker }
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker // If the -target-addr-end option wasn't explicitly passed, then set it to a
581*9880d681SAndroid Build Coastguard Worker // sensible default based on the target triple.
582*9880d681SAndroid Build Coastguard Worker if (TargetAddrEnd.getNumOccurrences() == 0) {
583*9880d681SAndroid Build Coastguard Worker if (TargetTriple.isArch16Bit())
584*9880d681SAndroid Build Coastguard Worker TargetAddrEnd = (1ULL << 16) - 1;
585*9880d681SAndroid Build Coastguard Worker else if (TargetTriple.isArch32Bit())
586*9880d681SAndroid Build Coastguard Worker TargetAddrEnd = (1ULL << 32) - 1;
587*9880d681SAndroid Build Coastguard Worker // TargetAddrEnd already has a sensible default for 64-bit systems, so
588*9880d681SAndroid Build Coastguard Worker // there's nothing to do in the 64-bit case.
589*9880d681SAndroid Build Coastguard Worker }
590*9880d681SAndroid Build Coastguard Worker
591*9880d681SAndroid Build Coastguard Worker // Process any elements remaining in the worklist.
592*9880d681SAndroid Build Coastguard Worker while (!Worklist.empty()) {
593*9880d681SAndroid Build Coastguard Worker std::pair<void*, uint64_t> CurEntry = Worklist.front();
594*9880d681SAndroid Build Coastguard Worker Worklist.pop_front();
595*9880d681SAndroid Build Coastguard Worker
596*9880d681SAndroid Build Coastguard Worker uint64_t NextSectionAddr = TargetAddrStart;
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Worker for (const auto &Alloc : AlreadyAllocated)
599*9880d681SAndroid Build Coastguard Worker if (NextSectionAddr + CurEntry.second + TargetSectionSep <= Alloc.first)
600*9880d681SAndroid Build Coastguard Worker break;
601*9880d681SAndroid Build Coastguard Worker else
602*9880d681SAndroid Build Coastguard Worker NextSectionAddr = Alloc.first + Alloc.second + TargetSectionSep;
603*9880d681SAndroid Build Coastguard Worker
604*9880d681SAndroid Build Coastguard Worker AlreadyAllocated[NextSectionAddr] = CurEntry.second;
605*9880d681SAndroid Build Coastguard Worker Checker.getRTDyld().mapSectionAddress(CurEntry.first, NextSectionAddr);
606*9880d681SAndroid Build Coastguard Worker }
607*9880d681SAndroid Build Coastguard Worker
608*9880d681SAndroid Build Coastguard Worker // Add dummy symbols to the memory manager.
609*9880d681SAndroid Build Coastguard Worker for (const auto &Mapping : DummySymbolMappings) {
610*9880d681SAndroid Build Coastguard Worker size_t EqualsIdx = Mapping.find_first_of("=");
611*9880d681SAndroid Build Coastguard Worker
612*9880d681SAndroid Build Coastguard Worker if (EqualsIdx == StringRef::npos)
613*9880d681SAndroid Build Coastguard Worker report_fatal_error("Invalid dummy symbol specification '" + Mapping +
614*9880d681SAndroid Build Coastguard Worker "'. Should be '<symbol name>=<addr>'");
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Worker std::string Symbol = Mapping.substr(0, EqualsIdx);
617*9880d681SAndroid Build Coastguard Worker std::string AddrStr = Mapping.substr(EqualsIdx + 1);
618*9880d681SAndroid Build Coastguard Worker
619*9880d681SAndroid Build Coastguard Worker uint64_t Addr;
620*9880d681SAndroid Build Coastguard Worker if (StringRef(AddrStr).getAsInteger(0, Addr))
621*9880d681SAndroid Build Coastguard Worker report_fatal_error("Invalid symbol mapping '" + Mapping + "'.");
622*9880d681SAndroid Build Coastguard Worker
623*9880d681SAndroid Build Coastguard Worker MemMgr.addDummySymbol(Symbol, Addr);
624*9880d681SAndroid Build Coastguard Worker }
625*9880d681SAndroid Build Coastguard Worker }
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Worker // Load and link the objects specified on the command line, but do not execute
628*9880d681SAndroid Build Coastguard Worker // anything. Instead, attach a RuntimeDyldChecker instance and call it to
629*9880d681SAndroid Build Coastguard Worker // verify the correctness of the linked memory.
linkAndVerify()630*9880d681SAndroid Build Coastguard Worker static int linkAndVerify() {
631*9880d681SAndroid Build Coastguard Worker
632*9880d681SAndroid Build Coastguard Worker // Check for missing triple.
633*9880d681SAndroid Build Coastguard Worker if (TripleName == "")
634*9880d681SAndroid Build Coastguard Worker ErrorAndExit("-triple required when running in -verify mode.");
635*9880d681SAndroid Build Coastguard Worker
636*9880d681SAndroid Build Coastguard Worker // Look up the target and build the disassembler.
637*9880d681SAndroid Build Coastguard Worker Triple TheTriple(Triple::normalize(TripleName));
638*9880d681SAndroid Build Coastguard Worker std::string ErrorStr;
639*9880d681SAndroid Build Coastguard Worker const Target *TheTarget =
640*9880d681SAndroid Build Coastguard Worker TargetRegistry::lookupTarget("", TheTriple, ErrorStr);
641*9880d681SAndroid Build Coastguard Worker if (!TheTarget)
642*9880d681SAndroid Build Coastguard Worker ErrorAndExit("Error accessing target '" + TripleName + "': " + ErrorStr);
643*9880d681SAndroid Build Coastguard Worker
644*9880d681SAndroid Build Coastguard Worker TripleName = TheTriple.getTriple();
645*9880d681SAndroid Build Coastguard Worker
646*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCSubtargetInfo> STI(
647*9880d681SAndroid Build Coastguard Worker TheTarget->createMCSubtargetInfo(TripleName, MCPU, ""));
648*9880d681SAndroid Build Coastguard Worker if (!STI)
649*9880d681SAndroid Build Coastguard Worker ErrorAndExit("Unable to create subtarget info!");
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName));
652*9880d681SAndroid Build Coastguard Worker if (!MRI)
653*9880d681SAndroid Build Coastguard Worker ErrorAndExit("Unable to create target register info!");
654*9880d681SAndroid Build Coastguard Worker
655*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCAsmInfo> MAI(TheTarget->createMCAsmInfo(*MRI, TripleName));
656*9880d681SAndroid Build Coastguard Worker if (!MAI)
657*9880d681SAndroid Build Coastguard Worker ErrorAndExit("Unable to create target asm info!");
658*9880d681SAndroid Build Coastguard Worker
659*9880d681SAndroid Build Coastguard Worker MCContext Ctx(MAI.get(), MRI.get(), nullptr);
660*9880d681SAndroid Build Coastguard Worker
661*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCDisassembler> Disassembler(
662*9880d681SAndroid Build Coastguard Worker TheTarget->createMCDisassembler(*STI, Ctx));
663*9880d681SAndroid Build Coastguard Worker if (!Disassembler)
664*9880d681SAndroid Build Coastguard Worker ErrorAndExit("Unable to create disassembler!");
665*9880d681SAndroid Build Coastguard Worker
666*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCInstrInfo> MII(TheTarget->createMCInstrInfo());
667*9880d681SAndroid Build Coastguard Worker
668*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MCInstPrinter> InstPrinter(
669*9880d681SAndroid Build Coastguard Worker TheTarget->createMCInstPrinter(Triple(TripleName), 0, *MAI, *MII, *MRI));
670*9880d681SAndroid Build Coastguard Worker
671*9880d681SAndroid Build Coastguard Worker // Load any dylibs requested on the command line.
672*9880d681SAndroid Build Coastguard Worker loadDylibs();
673*9880d681SAndroid Build Coastguard Worker
674*9880d681SAndroid Build Coastguard Worker // Instantiate a dynamic linker.
675*9880d681SAndroid Build Coastguard Worker TrivialMemoryManager MemMgr;
676*9880d681SAndroid Build Coastguard Worker doPreallocation(MemMgr);
677*9880d681SAndroid Build Coastguard Worker RuntimeDyld Dyld(MemMgr, MemMgr);
678*9880d681SAndroid Build Coastguard Worker Dyld.setProcessAllSections(true);
679*9880d681SAndroid Build Coastguard Worker RuntimeDyldChecker Checker(Dyld, Disassembler.get(), InstPrinter.get(),
680*9880d681SAndroid Build Coastguard Worker llvm::dbgs());
681*9880d681SAndroid Build Coastguard Worker
682*9880d681SAndroid Build Coastguard Worker // If we don't have any input files, read from stdin.
683*9880d681SAndroid Build Coastguard Worker if (!InputFileList.size())
684*9880d681SAndroid Build Coastguard Worker InputFileList.push_back("-");
685*9880d681SAndroid Build Coastguard Worker for (auto &Filename : InputFileList) {
686*9880d681SAndroid Build Coastguard Worker // Load the input memory buffer.
687*9880d681SAndroid Build Coastguard Worker ErrorOr<std::unique_ptr<MemoryBuffer>> InputBuffer =
688*9880d681SAndroid Build Coastguard Worker MemoryBuffer::getFileOrSTDIN(Filename);
689*9880d681SAndroid Build Coastguard Worker
690*9880d681SAndroid Build Coastguard Worker if (std::error_code EC = InputBuffer.getError())
691*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to read input: '" + EC.message() + "'");
692*9880d681SAndroid Build Coastguard Worker
693*9880d681SAndroid Build Coastguard Worker Expected<std::unique_ptr<ObjectFile>> MaybeObj(
694*9880d681SAndroid Build Coastguard Worker ObjectFile::createObjectFile((*InputBuffer)->getMemBufferRef()));
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Worker if (!MaybeObj) {
697*9880d681SAndroid Build Coastguard Worker std::string Buf;
698*9880d681SAndroid Build Coastguard Worker raw_string_ostream OS(Buf);
699*9880d681SAndroid Build Coastguard Worker logAllUnhandledErrors(MaybeObj.takeError(), OS, "");
700*9880d681SAndroid Build Coastguard Worker OS.flush();
701*9880d681SAndroid Build Coastguard Worker ErrorAndExit("unable to create object file: '" + Buf + "'");
702*9880d681SAndroid Build Coastguard Worker }
703*9880d681SAndroid Build Coastguard Worker
704*9880d681SAndroid Build Coastguard Worker ObjectFile &Obj = **MaybeObj;
705*9880d681SAndroid Build Coastguard Worker
706*9880d681SAndroid Build Coastguard Worker // Load the object file
707*9880d681SAndroid Build Coastguard Worker Dyld.loadObject(Obj);
708*9880d681SAndroid Build Coastguard Worker if (Dyld.hasError()) {
709*9880d681SAndroid Build Coastguard Worker ErrorAndExit(Dyld.getErrorString());
710*9880d681SAndroid Build Coastguard Worker }
711*9880d681SAndroid Build Coastguard Worker }
712*9880d681SAndroid Build Coastguard Worker
713*9880d681SAndroid Build Coastguard Worker // Re-map the section addresses into the phony target address space and add
714*9880d681SAndroid Build Coastguard Worker // dummy symbols.
715*9880d681SAndroid Build Coastguard Worker remapSectionsAndSymbols(TheTriple, MemMgr, Checker);
716*9880d681SAndroid Build Coastguard Worker
717*9880d681SAndroid Build Coastguard Worker // Resolve all the relocations we can.
718*9880d681SAndroid Build Coastguard Worker Dyld.resolveRelocations();
719*9880d681SAndroid Build Coastguard Worker
720*9880d681SAndroid Build Coastguard Worker // Register EH frames.
721*9880d681SAndroid Build Coastguard Worker Dyld.registerEHFrames();
722*9880d681SAndroid Build Coastguard Worker
723*9880d681SAndroid Build Coastguard Worker int ErrorCode = checkAllExpressions(Checker);
724*9880d681SAndroid Build Coastguard Worker if (Dyld.hasError())
725*9880d681SAndroid Build Coastguard Worker ErrorAndExit("RTDyld reported an error applying relocations:\n " +
726*9880d681SAndroid Build Coastguard Worker Dyld.getErrorString());
727*9880d681SAndroid Build Coastguard Worker
728*9880d681SAndroid Build Coastguard Worker return ErrorCode;
729*9880d681SAndroid Build Coastguard Worker }
730*9880d681SAndroid Build Coastguard Worker
main(int argc,char ** argv)731*9880d681SAndroid Build Coastguard Worker int main(int argc, char **argv) {
732*9880d681SAndroid Build Coastguard Worker sys::PrintStackTraceOnErrorSignal(argv[0]);
733*9880d681SAndroid Build Coastguard Worker PrettyStackTraceProgram X(argc, argv);
734*9880d681SAndroid Build Coastguard Worker
735*9880d681SAndroid Build Coastguard Worker ProgramName = argv[0];
736*9880d681SAndroid Build Coastguard Worker llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllTargetInfos();
739*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllTargetMCs();
740*9880d681SAndroid Build Coastguard Worker llvm::InitializeAllDisassemblers();
741*9880d681SAndroid Build Coastguard Worker
742*9880d681SAndroid Build Coastguard Worker cl::ParseCommandLineOptions(argc, argv, "llvm MC-JIT tool\n");
743*9880d681SAndroid Build Coastguard Worker
744*9880d681SAndroid Build Coastguard Worker switch (Action) {
745*9880d681SAndroid Build Coastguard Worker case AC_Execute:
746*9880d681SAndroid Build Coastguard Worker return executeInput();
747*9880d681SAndroid Build Coastguard Worker case AC_PrintDebugLineInfo:
748*9880d681SAndroid Build Coastguard Worker return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */ true);
749*9880d681SAndroid Build Coastguard Worker case AC_PrintLineInfo:
750*9880d681SAndroid Build Coastguard Worker return printLineInfoForInput(/* LoadObjects */ true,/* UseDebugObj */false);
751*9880d681SAndroid Build Coastguard Worker case AC_PrintObjectLineInfo:
752*9880d681SAndroid Build Coastguard Worker return printLineInfoForInput(/* LoadObjects */false,/* UseDebugObj */false);
753*9880d681SAndroid Build Coastguard Worker case AC_Verify:
754*9880d681SAndroid Build Coastguard Worker return linkAndVerify();
755*9880d681SAndroid Build Coastguard Worker }
756*9880d681SAndroid Build Coastguard Worker }
757