diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-01-22 14:21:19 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-01-22 14:21:19 +0000 |
commit | c4c7ea3184335259da63d973acbed2043e8a6523 (patch) | |
tree | 965a21f78cc71764eae9ce6fddad6fd28aa75568 /tools/llvm-symbolizer/LLVMSymbolize.h | |
parent | be0008a4df72bf9da3246707cdec2766ace75d32 (diff) |
llvm-symbolizer: factor out bits of the tool into separate LLVMSymbolize.{h,cpp} files. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173159 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-symbolizer/LLVMSymbolize.h')
-rw-r--r-- | tools/llvm-symbolizer/LLVMSymbolize.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/llvm-symbolizer/LLVMSymbolize.h b/tools/llvm-symbolizer/LLVMSymbolize.h new file mode 100644 index 0000000000..aae6f00206 --- /dev/null +++ b/tools/llvm-symbolizer/LLVMSymbolize.h @@ -0,0 +1,88 @@ +//===-- LLVMSymbolize.h ----------------------------------------- C++ -----===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Header for LLVM symbolization library. +// +//===----------------------------------------------------------------------===// +#ifndef LLVM_SYMBOLIZE_H +#define LLVM_SYMBOLIZE_H + +#include "llvm/ADT/OwningPtr.h" +#include "llvm/DebugInfo/DIContext.h" +#include "llvm/Object/ObjectFile.h" +#include "llvm/Support/MemoryBuffer.h" +#include <map> +#include <string> + +namespace llvm { + +using namespace object; + +namespace symbolize { + +class ModuleInfo; + +class LLVMSymbolizer { +public: + struct Options { + bool UseSymbolTable : 1; + bool PrintFunctions : 1; + bool PrintInlining : 1; + bool Demangle : 1; + Options(bool UseSymbolTable = true, bool PrintFunctions = true, + bool PrintInlining = true, bool Demangle = true) + : UseSymbolTable(UseSymbolTable), + PrintFunctions(PrintFunctions), + PrintInlining(PrintInlining), + Demangle(Demangle) { } + }; + + LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) { } + + // Returns the result of symbolization for module name/offset as + // a string (possibly containing newlines). + std::string symbolizeCode(const std::string &ModuleName, + uint64_t ModuleOffset); + std::string symbolizeData(const std::string &ModuleName, + uint64_t ModuleOffset); +private: + ModuleInfo *getOrCreateModuleInfo(const std::string &ModuleName); + std::string printDILineInfo(DILineInfo LineInfo) const; + void DemangleName(std::string &Name) const; + + typedef std::map<std::string, ModuleInfo*> ModuleMapTy; + ModuleMapTy Modules; + Options Opts; + static const std::string kBadString; +}; + +class ModuleInfo { + OwningPtr<ObjectFile> Module; + OwningPtr<DIContext> DebugInfoContext; + public: + ModuleInfo(ObjectFile *Obj, DIContext *DICtx) + : Module(Obj), DebugInfoContext(DICtx) {} + + DILineInfo symbolizeCode( + uint64_t ModuleOffset, const LLVMSymbolizer::Options& Opts) const; + DIInliningInfo symbolizeInlinedCode( + uint64_t ModuleOffset, const LLVMSymbolizer::Options& Opts) const; + bool symbolizeData(uint64_t ModuleOffset, std::string &Name, + uint64_t &Start, uint64_t &Size) const; + + private: + bool getNameFromSymbolTable(SymbolRef::Type Type, uint64_t Address, + std::string &Name, uint64_t &Addr, + uint64_t &Size) const; +}; + +} // namespace symbolize +} // namespace llvm + +#endif // LLVM_SYMBOLIZE_H |