mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 04:39:44 +00:00
84831cda66
Summary: PE files are stripped by default, and only contain the names of exported symbols. The actual reason that we bother to do this override by default is actually due to a quirk of the way -gline-tables-only is implemented, so I phrased the check as "if we are symbolizing from dwarf, do the symtab override". This fixes lots of Windows ASan tests that I broke in r250582. Reviewers: samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14594 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253051 91177308-0d34-0410-b5e6-96231b3b80d8
83 lines
3.0 KiB
C++
83 lines
3.0 KiB
C++
//===-- SymbolizableObjectFile.h -------------------------------- C++ -----===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares the SymbolizableObjectFile class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
|
|
#define LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
|
|
|
|
#include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
|
|
#include <map>
|
|
|
|
namespace llvm {
|
|
class DataExtractor;
|
|
}
|
|
|
|
namespace llvm {
|
|
namespace symbolize {
|
|
|
|
class SymbolizableObjectFile : public SymbolizableModule {
|
|
public:
|
|
static ErrorOr<std::unique_ptr<SymbolizableObjectFile>>
|
|
create(object::ObjectFile *Obj, std::unique_ptr<DIContext> DICtx);
|
|
|
|
DILineInfo symbolizeCode(uint64_t ModuleOffset, FunctionNameKind FNKind,
|
|
bool UseSymbolTable) const override;
|
|
DIInliningInfo symbolizeInlinedCode(uint64_t ModuleOffset,
|
|
FunctionNameKind FNKind,
|
|
bool UseSymbolTable) const override;
|
|
DIGlobal symbolizeData(uint64_t ModuleOffset) const override;
|
|
|
|
// Return true if this is a 32-bit x86 PE COFF module.
|
|
bool isWin32Module() const override;
|
|
|
|
// Returns the preferred base of the module, i.e. where the loader would place
|
|
// it in memory assuming there were no conflicts.
|
|
uint64_t getModulePreferredBase() const override;
|
|
|
|
private:
|
|
bool shouldOverrideWithSymbolTable(FunctionNameKind FNKind,
|
|
bool UseSymbolTable) const;
|
|
|
|
bool getNameFromSymbolTable(object::SymbolRef::Type Type, uint64_t Address,
|
|
std::string &Name, uint64_t &Addr,
|
|
uint64_t &Size) const;
|
|
// For big-endian PowerPC64 ELF, OpdAddress is the address of the .opd
|
|
// (function descriptor) section and OpdExtractor refers to its contents.
|
|
std::error_code addSymbol(const object::SymbolRef &Symbol,
|
|
uint64_t SymbolSize,
|
|
DataExtractor *OpdExtractor = nullptr,
|
|
uint64_t OpdAddress = 0);
|
|
std::error_code addCoffExportSymbols(const object::COFFObjectFile *CoffObj);
|
|
|
|
object::ObjectFile *Module;
|
|
std::unique_ptr<DIContext> DebugInfoContext;
|
|
|
|
struct SymbolDesc {
|
|
uint64_t Addr;
|
|
// If size is 0, assume that symbol occupies the whole memory range up to
|
|
// the following symbol.
|
|
uint64_t Size;
|
|
friend bool operator<(const SymbolDesc &s1, const SymbolDesc &s2) {
|
|
return s1.Addr < s2.Addr;
|
|
}
|
|
};
|
|
std::map<SymbolDesc, StringRef> Functions;
|
|
std::map<SymbolDesc, StringRef> Objects;
|
|
|
|
SymbolizableObjectFile(object::ObjectFile *Obj,
|
|
std::unique_ptr<DIContext> DICtx);
|
|
};
|
|
|
|
} // namespace symbolize
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_LIB_DEBUGINFO_SYMBOLIZE_SYMBOLIZABLEOBJECTFILE_H
|