mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-07 11:33:44 +00:00
b13d54f588
Implement debug_loc.dwo, as well as llvm-dwarfdump support for dumping this section. Outlined in the DWARF5 spec and http://gcc.gnu.org/wiki/DebugFission the debug_loc.dwo section has more variation than the standard debug_loc, allowing 3 different forms of entry (plus the end of list entry). GCC seems to, and Clang certainly, only use one form, so I've just implemented dumping support for that for now. It wasn't immediately obvious that there was a good refactoring to share the implementation of dumping support between debug_loc and debug_loc.dwo, so they're separate for now - ideas welcome or I may come back to it at some point. As per a comment in the code, we could choose different forms that may reduce the number of debug_addr entries we emit, but that will require further study. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204697 91177308-0d34-0410-b5e6-96231b3b80d8
158 lines
4.5 KiB
C++
158 lines
4.5 KiB
C++
//===-- DIContext.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 defines DIContext, an abstract data structure that holds
|
|
// debug information data.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_DEBUGINFO_DICONTEXT_H
|
|
#define LLVM_DEBUGINFO_DICONTEXT_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Object/ObjectFile.h"
|
|
#include "llvm/Object/RelocVisitor.h"
|
|
#include "llvm/Support/Casting.h"
|
|
#include "llvm/Support/DataTypes.h"
|
|
|
|
namespace llvm {
|
|
|
|
class raw_ostream;
|
|
|
|
/// DILineInfo - a format-neutral container for source line information.
|
|
class DILineInfo {
|
|
SmallString<16> FileName;
|
|
SmallString<16> FunctionName;
|
|
uint32_t Line;
|
|
uint32_t Column;
|
|
public:
|
|
DILineInfo()
|
|
: FileName("<invalid>"), FunctionName("<invalid>"),
|
|
Line(0), Column(0) {}
|
|
DILineInfo(StringRef fileName, StringRef functionName, uint32_t line,
|
|
uint32_t column)
|
|
: FileName(fileName), FunctionName(functionName), Line(line),
|
|
Column(column) {}
|
|
|
|
const char *getFileName() { return FileName.c_str(); }
|
|
const char *getFunctionName() { return FunctionName.c_str(); }
|
|
uint32_t getLine() const { return Line; }
|
|
uint32_t getColumn() const { return Column; }
|
|
|
|
bool operator==(const DILineInfo &RHS) const {
|
|
return Line == RHS.Line && Column == RHS.Column &&
|
|
FileName.equals(RHS.FileName) &&
|
|
FunctionName.equals(RHS.FunctionName);
|
|
}
|
|
bool operator!=(const DILineInfo &RHS) const {
|
|
return !(*this == RHS);
|
|
}
|
|
};
|
|
|
|
typedef SmallVector<std::pair<uint64_t, DILineInfo>, 16> DILineInfoTable;
|
|
|
|
/// DIInliningInfo - a format-neutral container for inlined code description.
|
|
class DIInliningInfo {
|
|
SmallVector<DILineInfo, 4> Frames;
|
|
public:
|
|
DIInliningInfo() {}
|
|
DILineInfo getFrame(unsigned Index) const {
|
|
assert(Index < Frames.size());
|
|
return Frames[Index];
|
|
}
|
|
uint32_t getNumberOfFrames() const {
|
|
return Frames.size();
|
|
}
|
|
void addFrame(const DILineInfo &Frame) {
|
|
Frames.push_back(Frame);
|
|
}
|
|
};
|
|
|
|
/// DILineInfoSpecifier - controls which fields of DILineInfo container
|
|
/// should be filled with data.
|
|
class DILineInfoSpecifier {
|
|
const uint32_t Flags; // Or'ed flags that set the info we want to fetch.
|
|
public:
|
|
enum Specification {
|
|
FileLineInfo = 1 << 0,
|
|
AbsoluteFilePath = 1 << 1,
|
|
FunctionName = 1 << 2
|
|
};
|
|
// Use file/line info by default.
|
|
DILineInfoSpecifier(uint32_t flags = FileLineInfo) : Flags(flags) {}
|
|
bool needs(Specification spec) const {
|
|
return (Flags & spec) > 0;
|
|
}
|
|
};
|
|
|
|
/// Selects which debug sections get dumped.
|
|
enum DIDumpType {
|
|
DIDT_Null,
|
|
DIDT_All,
|
|
DIDT_Abbrev,
|
|
DIDT_AbbrevDwo,
|
|
DIDT_Aranges,
|
|
DIDT_Frames,
|
|
DIDT_Info,
|
|
DIDT_InfoDwo,
|
|
DIDT_Types,
|
|
DIDT_TypesDwo,
|
|
DIDT_Line,
|
|
DIDT_LineDwo,
|
|
DIDT_Loc,
|
|
DIDT_LocDwo,
|
|
DIDT_Ranges,
|
|
DIDT_Pubnames,
|
|
DIDT_Pubtypes,
|
|
DIDT_GnuPubnames,
|
|
DIDT_GnuPubtypes,
|
|
DIDT_Str,
|
|
DIDT_StrDwo,
|
|
DIDT_StrOffsetsDwo
|
|
};
|
|
|
|
// In place of applying the relocations to the data we've read from disk we use
|
|
// a separate mapping table to the side and checking that at locations in the
|
|
// dwarf where we expect relocated values. This adds a bit of complexity to the
|
|
// dwarf parsing/extraction at the benefit of not allocating memory for the
|
|
// entire size of the debug info sections.
|
|
typedef DenseMap<uint64_t, std::pair<uint8_t, int64_t> > RelocAddrMap;
|
|
|
|
class DIContext {
|
|
public:
|
|
enum DIContextKind {
|
|
CK_DWARF
|
|
};
|
|
DIContextKind getKind() const { return Kind; }
|
|
|
|
DIContext(DIContextKind K) : Kind(K) {}
|
|
virtual ~DIContext();
|
|
|
|
/// getDWARFContext - get a context for binary DWARF data.
|
|
static DIContext *getDWARFContext(object::ObjectFile *);
|
|
|
|
virtual void dump(raw_ostream &OS, DIDumpType DumpType = DIDT_All) = 0;
|
|
|
|
virtual DILineInfo getLineInfoForAddress(uint64_t Address,
|
|
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
|
|
virtual DILineInfoTable getLineInfoForAddressRange(uint64_t Address,
|
|
uint64_t Size, DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
|
|
virtual DIInliningInfo getInliningInfoForAddress(uint64_t Address,
|
|
DILineInfoSpecifier Specifier = DILineInfoSpecifier()) = 0;
|
|
private:
|
|
const DIContextKind Kind;
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|