[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