From 0a30cccd493e3bc82a5771ca15326f7cc8b6cb8c Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 21 Aug 2013 07:28:29 +0000 Subject: MC CFG: Add MCObjectDisassembler support for entrypoint + static ctors. For now, this isn't implemented for any format. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188882 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCObjectDisassembler.cpp | 51 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'lib/MC/MCObjectDisassembler.cpp') diff --git a/lib/MC/MCObjectDisassembler.cpp b/lib/MC/MCObjectDisassembler.cpp index 1ea6eed307..ef8fef1a5a 100644 --- a/lib/MC/MCObjectDisassembler.cpp +++ b/lib/MC/MCObjectDisassembler.cpp @@ -33,8 +33,40 @@ MCObjectDisassembler::MCObjectDisassembler(const ObjectFile &Obj, const MCInstrAnalysis &MIA) : Obj(Obj), Dis(Dis), MIA(MIA) {} -MCModule *MCObjectDisassembler::buildModule(bool withCFG) { +uint64_t MCObjectDisassembler::getEntrypoint() { + error_code ec; + for (symbol_iterator SI = Obj.begin_symbols(), SE = Obj.end_symbols(); + SI != SE; SI.increment(ec)) { + if (ec) + break; + StringRef Name; + SI->getName(Name); + if (Name == "main" || Name == "_main") { + uint64_t Entrypoint; + SI->getAddress(Entrypoint); + return Entrypoint; + } + } + return 0; +} + +ArrayRef MCObjectDisassembler::getStaticInitFunctions() { + return ArrayRef(); +} + +ArrayRef MCObjectDisassembler::getStaticExitFunctions() { + return ArrayRef(); +} + +MCModule *MCObjectDisassembler::buildEmptyModule() { MCModule *Module = new MCModule; + Module->Entrypoint = getEntrypoint(); + return Module; +} + +MCModule *MCObjectDisassembler::buildModule(bool withCFG) { + MCModule *Module = buildEmptyModule(); + buildSectionAtoms(Module); if (withCFG) buildCFG(Module); @@ -60,7 +92,7 @@ void MCObjectDisassembler::buildSectionAtoms(MCModule *Module) { continue; StringRef Contents; SI->getContents(Contents); - StringRefMemoryObject memoryObject(Contents); + StringRefMemoryObject memoryObject(Contents, StartAddr); // We don't care about things like non-file-backed sections yet. if (Contents.size() != SecSize || !SecSize) @@ -116,6 +148,21 @@ void MCObjectDisassembler::buildCFG(MCModule *Module) { AddressSetTy Splits; AddressSetTy Calls; + error_code ec; + for (symbol_iterator SI = Obj.begin_symbols(), SE = Obj.end_symbols(); + SI != SE; SI.increment(ec)) { + if (ec) + break; + SymbolRef::Type SymType; + SI->getType(SymType); + if (SymType == SymbolRef::ST_Function) { + uint64_t SymAddr; + SI->getAddress(SymAddr); + Calls.insert(SymAddr); + Splits.insert(SymAddr); + } + } + assert(Module->func_begin() == Module->func_end() && "Module already has a CFG!"); -- cgit v1.2.3