//===- Symbolize.h ----------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Header for LLVM symbolization library. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZE_H #define LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZE_H #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Error.h" #include #include #include #include #include #include #include namespace llvm { namespace symbolize { using namespace object; using FunctionNameKind = DILineInfoSpecifier::FunctionNameKind; using FileLineInfoKind = DILineInfoSpecifier::FileLineInfoKind; class LLVMSymbolizer { public: struct Options { FunctionNameKind PrintFunctions = FunctionNameKind::LinkageName; FileLineInfoKind PathStyle = FileLineInfoKind::AbsoluteFilePath; bool UseSymbolTable = true; bool Demangle = true; bool RelativeAddresses = false; bool UntagAddresses = false; bool UseDIA = false; std::string DefaultArch; std::vector DsymHints; std::string FallbackDebugPath; std::string DWPName; std::vector DebugFileDirectory; }; LLVMSymbolizer() = default; LLVMSymbolizer(const Options &Opts) : Opts(Opts) {} ~LLVMSymbolizer() { flush(); } // Overloads accepting ObjectFile does not support COFF currently Expected symbolizeCode(const ObjectFile &Obj, object::SectionedAddress ModuleOffset); Expected symbolizeCode(const std::string &ModuleName, object::SectionedAddress ModuleOffset); Expected symbolizeInlinedCode(const ObjectFile &Obj, object::SectionedAddress ModuleOffset); Expected symbolizeInlinedCode(const std::string &ModuleName, object::SectionedAddress ModuleOffset); Expected symbolizeData(const ObjectFile &Obj, object::SectionedAddress ModuleOffset); Expected symbolizeData(const std::string &ModuleName, object::SectionedAddress ModuleOffset); Expected> symbolizeFrame(const ObjectFile &Obj, object::SectionedAddress ModuleOffset); Expected> symbolizeFrame(const std::string &ModuleName, object::SectionedAddress ModuleOffset); void flush(); static std::string DemangleName(const std::string &Name, const SymbolizableModule *DbiModuleDescriptor); private: // Bundles together object file with code/data and object file with // corresponding debug info. These objects can be the same. using ObjectPair = std::pair; template Expected symbolizeCodeCommon(const T &ModuleSpecifier, object::SectionedAddress ModuleOffset); template Expected symbolizeInlinedCodeCommon(const T &ModuleSpecifier, object::SectionedAddress ModuleOffset); template Expected symbolizeDataCommon(const T &ModuleSpecifier, object::SectionedAddress ModuleOffset); template Expected> symbolizeFrameCommon(const T &ModuleSpecifier, object::SectionedAddress ModuleOffset); /// Returns a SymbolizableModule or an error if loading debug info failed. /// Only one attempt is made to load a module, and errors during loading are /// only reported once. Subsequent calls to get module info for a module that /// failed to load will return nullptr. Expected getOrCreateModuleInfo(const std::string &ModuleName); Expected getOrCreateModuleInfo(const ObjectFile &Obj); Expected createModuleInfo(const ObjectFile *Obj, std::unique_ptr Context, StringRef ModuleName); ObjectFile *lookUpDsymFile(const std::string &Path, const MachOObjectFile *ExeObj, const std::string &ArchName); ObjectFile *lookUpDebuglinkObject(const std::string &Path, const ObjectFile *Obj, const std::string &ArchName); ObjectFile *lookUpBuildIDObject(const std::string &Path, const ELFObjectFileBase *Obj, const std::string &ArchName); /// Returns pair of pointers to object and debug object. Expected getOrCreateObjectPair(const std::string &Path, const std::string &ArchName); /// Return a pointer to object file at specified path, for a specified /// architecture (e.g. if path refers to a Mach-O universal binary, only one /// object file from it will be returned). Expected getOrCreateObject(const std::string &Path, const std::string &ArchName); std::map, std::less<>> Modules; /// Contains cached results of getOrCreateObjectPair(). std::map, ObjectPair> ObjectPairForPathArch; /// Contains parsed binary for each path, or parsing error. std::map> BinaryForPath; /// Parsed object file for path/architecture pair, where "path" refers /// to Mach-O universal binary. std::map, std::unique_ptr> ObjectForUBPathAndArch; Options Opts; }; } // end namespace symbolize } // end namespace llvm #endif // LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZE_H