[llvm] r188882 - MC CFG: Add MCObjectDisassembler support for entrypoint + static ctors.
David Blaikie
dblaikie at gmail.com
Wed Aug 21 10:24:38 PDT 2013
On Wed, Aug 21, 2013 at 12:28 AM, Ahmed Bougacha
<ahmed.bougacha at gmail.com> wrote:
> Author: ab
> Date: Wed Aug 21 02:28:29 2013
> New Revision: 188882
>
> URL: http://llvm.org/viewvc/llvm-project?rev=188882&view=rev
> Log:
> MC CFG: Add MCObjectDisassembler support for entrypoint + static ctors.
>
> For now, this isn't implemented for any format.
Again, would be nice to see this with its usage (or as close to as
possible - eg: a paired commit, if that was necessary - but I'd
probably prefer just a single commit with "feature + usage").
>
> Modified:
> llvm/trunk/include/llvm/MC/MCObjectDisassembler.h
> llvm/trunk/lib/MC/MCObjectDisassembler.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCObjectDisassembler.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectDisassembler.h?rev=188882&r1=188881&r2=188882&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCObjectDisassembler.h (original)
> +++ llvm/trunk/include/llvm/MC/MCObjectDisassembler.h Wed Aug 21 02:28:29 2013
> @@ -15,6 +15,10 @@
> #ifndef LLVM_MC_MCOBJECTDISASSEMBLER_H
> #define LLVM_MC_MCOBJECTDISASSEMBLER_H
>
> +#include "llvm/ADT/ArrayRef.h"
> +#include "llvm/ADT/StringRef.h"
> +#include "llvm/Support/DataTypes.h"
> +
> namespace llvm {
>
> namespace object {
> @@ -33,14 +37,11 @@ class MCModule;
> /// It can also be used to create a control flow graph consisting of MCFunctions
> /// and MCBasicBlocks.
> class MCObjectDisassembler {
> - const object::ObjectFile &Obj;
> - const MCDisassembler &Dis;
> - const MCInstrAnalysis &MIA;
> -
> public:
> MCObjectDisassembler(const object::ObjectFile &Obj,
> const MCDisassembler &Dis,
> const MCInstrAnalysis &MIA);
> + virtual ~MCObjectDisassembler() {}
>
> /// \brief Build an MCModule, creating atoms and optionally functions.
> /// \param withCFG Also build a CFG by adding MCFunctions to the Module.
> @@ -50,6 +51,25 @@ public:
> /// block atoms, which then each back an MCBasicBlock.
> MCModule *buildModule(bool withCFG = false);
>
> + MCModule *buildEmptyModule();
> +
> + /// \brief Get the effective address of the entrypoint, or 0 if there is none.
> + virtual uint64_t getEntrypoint();
> +
> + /// \name Get the addresses of static constructors/destructors in the object.
> + /// The caller is expected to know how to interpret the addresses;
> + /// for example, Mach-O init functions expect 5 arguments, not for ELF.
> + /// The addresses are original object file load addresses, not effective.
> + /// @{
> + virtual ArrayRef<uint64_t> getStaticInitFunctions();
> + virtual ArrayRef<uint64_t> getStaticExitFunctions();
> + /// @}
> +
> +protected:
> + const object::ObjectFile &Obj;
> + const MCDisassembler &Dis;
> + const MCInstrAnalysis &MIA;
> +
> private:
> /// \brief Fill \p Module by creating an atom for each section.
> /// This could be made much smarter, using information like symbols, but also
>
> Modified: llvm/trunk/lib/MC/MCObjectDisassembler.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectDisassembler.cpp?rev=188882&r1=188881&r2=188882&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectDisassembler.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectDisassembler.cpp Wed Aug 21 02:28:29 2013
> @@ -33,8 +33,40 @@ MCObjectDisassembler::MCObjectDisassembl
> 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<uint64_t> MCObjectDisassembler::getStaticInitFunctions() {
> + return ArrayRef<uint64_t>();
> +}
> +
> +ArrayRef<uint64_t> MCObjectDisassembler::getStaticExitFunctions() {
> + return ArrayRef<uint64_t>();
> +}
> +
> +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::buildSectionA
> 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(MCMo
> 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!");
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list