Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- SymbolizableObjectFile.h ---------------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file declares the SymbolizableObjectFile class.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #ifndef LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
  13. #define LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
  14.  
  15. #include "llvm/ADT/StringRef.h"
  16. #include "llvm/DebugInfo/DIContext.h"
  17. #include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
  18. #include "llvm/Support/Error.h"
  19. #include <cstdint>
  20. #include <memory>
  21. #include <string>
  22. #include <utility>
  23. #include <vector>
  24.  
  25. namespace llvm {
  26.  
  27. class DataExtractor;
  28.  
  29. namespace symbolize {
  30.  
  31. class SymbolizableObjectFile : public SymbolizableModule {
  32. public:
  33.   static Expected<std::unique_ptr<SymbolizableObjectFile>>
  34.   create(const object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx,
  35.          bool UntagAddresses);
  36.  
  37.   DILineInfo symbolizeCode(object::SectionedAddress ModuleOffset,
  38.                            DILineInfoSpecifier LineInfoSpecifier,
  39.                            bool UseSymbolTable) const override;
  40.   DIInliningInfo symbolizeInlinedCode(object::SectionedAddress ModuleOffset,
  41.                                       DILineInfoSpecifier LineInfoSpecifier,
  42.                                       bool UseSymbolTable) const override;
  43.   DIGlobal symbolizeData(object::SectionedAddress ModuleOffset) const override;
  44.   std::vector<DILocal>
  45.   symbolizeFrame(object::SectionedAddress ModuleOffset) const override;
  46.  
  47.   // Return true if this is a 32-bit x86 PE COFF module.
  48.   bool isWin32Module() const override;
  49.  
  50.   // Returns the preferred base of the module, i.e. where the loader would place
  51.   // it in memory assuming there were no conflicts.
  52.   uint64_t getModulePreferredBase() const override;
  53.  
  54. private:
  55.   bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind,
  56.                                      bool UseSymbolTable) const;
  57.  
  58.   bool getNameFromSymbolTable(uint64_t Address, std::string &Name,
  59.                               uint64_t &Addr, uint64_t &Size,
  60.                               std::string &FileName) const;
  61.   // For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd
  62.   // (function descriptor) section and OpdExtractor refers to its contents.
  63.   Error addSymbol(const object::SymbolRef &Symbol, uint64_t SymbolSize,
  64.                   DataExtractor *OpdExtractor = nullptr,
  65.                   uint64_t OpdAddress = 0);
  66.   Error addCoffExportSymbols(const object::COFFObjectFile *CoffObj);
  67.  
  68.   /// Search for the first occurence of specified Address in ObjectFile.
  69.   uint64_t getModuleSectionIndexForAddress(uint64_t Address) const;
  70.  
  71.   const object::ObjectFile *Module;
  72.   std::unique_ptr<DIContext> DebugInfoContext;
  73.   bool UntagAddresses;
  74.  
  75.   struct SymbolDesc {
  76.     uint64_t Addr;
  77.     // If size is 0, assume that symbol occupies the whole memory range up to
  78.     // the following symbol.
  79.     uint64_t Size;
  80.  
  81.     StringRef Name;
  82.     // Non-zero if this is an ELF local symbol. See the comment in
  83.     // getNameFromSymbolTable.
  84.     uint32_t ELFLocalSymIdx;
  85.  
  86.     bool operator<(const SymbolDesc &RHS) const {
  87.       return Addr != RHS.Addr ? Addr < RHS.Addr : Size < RHS.Size;
  88.     }
  89.   };
  90.   std::vector<SymbolDesc> Symbols;
  91.   // (index, filename) pairs of ELF STT_FILE symbols.
  92.   std::vector<std::pair<uint32_t, StringRef>> FileSymbols;
  93.  
  94.   SymbolizableObjectFile(const object::ObjectFile *Obj,
  95.                          std::unique_ptr<DIContext> DICtx,
  96.                          bool UntagAddresses);
  97. };
  98.  
  99. } // end namespace symbolize
  100.  
  101. } // end namespace llvm
  102.  
  103. #endif // LLVM_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
  104.