DwarfCompileUnit.h [plain text]
#ifndef CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
#define CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H
#include "DIE.h"
#include "llvm/Analysis/DebugInfo.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/OwningPtr.h"
namespace llvm {
class DwarfDebug;
class MachineLocation;
class MachineOperand;
class ConstantInt;
class DbgVariable;
class CompileUnit {
unsigned ID;
unsigned Language;
const OwningPtr<DIE> CUDie;
AsmPrinter *Asm;
DwarfDebug *DD;
DIE *IndexTyDie;
DenseMap<const MDNode *, DIE *> MDNodeToDieMap;
DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap;
StringMap<DIE*> GlobalTypes;
StringMap<std::vector<DIE*> > AccelNames;
StringMap<std::vector<DIE*> > AccelObjC;
StringMap<std::vector<DIE*> > AccelNamespace;
StringMap<std::vector<std::pair<DIE*, unsigned> > > AccelTypes;
std::vector<DIEBlock *> DIEBlocks;
DenseMap<DIE *, const MDNode *> ContainingTypeMap;
public:
CompileUnit(unsigned I, unsigned L, DIE *D, AsmPrinter *A, DwarfDebug *DW);
~CompileUnit();
unsigned getID() const { return ID; }
unsigned getLanguage() const { return Language; }
DIE* getCUDie() const { return CUDie.get(); }
const StringMap<DIE*> &getGlobalTypes() const { return GlobalTypes; }
const StringMap<std::vector<DIE*> > &getAccelNames() const {
return AccelNames;
}
const StringMap<std::vector<DIE*> > &getAccelObjC() const {
return AccelObjC;
}
const StringMap<std::vector<DIE*> > &getAccelNamespace() const {
return AccelNamespace;
}
const StringMap<std::vector<std::pair<DIE*, unsigned > > >
&getAccelTypes() const {
return AccelTypes;
}
bool hasContent() const { return !CUDie->getChildren().empty(); }
void addGlobalType(DIType Ty);
void addAccelName(StringRef Name, DIE *Die) {
std::vector<DIE*> &DIEs = AccelNames[Name];
DIEs.push_back(Die);
}
void addAccelObjC(StringRef Name, DIE *Die) {
std::vector<DIE*> &DIEs = AccelObjC[Name];
DIEs.push_back(Die);
}
void addAccelNamespace(StringRef Name, DIE *Die) {
std::vector<DIE*> &DIEs = AccelNamespace[Name];
DIEs.push_back(Die);
}
void addAccelType(StringRef Name, std::pair<DIE *, unsigned> Die) {
std::vector<std::pair<DIE*, unsigned > > &DIEs = AccelTypes[Name];
DIEs.push_back(Die);
}
DIE *getDIE(const MDNode *N) { return MDNodeToDieMap.lookup(N); }
DIEBlock *getDIEBlock() {
return new (DIEValueAllocator) DIEBlock();
}
void insertDIE(const MDNode *N, DIE *D) {
MDNodeToDieMap.insert(std::make_pair(N, D));
}
DIEEntry *getDIEEntry(const MDNode *N) {
DenseMap<const MDNode *, DIEEntry *>::iterator I =
MDNodeToDIEEntryMap.find(N);
if (I == MDNodeToDIEEntryMap.end())
return NULL;
return I->second;
}
void insertDIEEntry(const MDNode *N, DIEEntry *E) {
MDNodeToDIEEntryMap.insert(std::make_pair(N, E));
}
void addDie(DIE *Buffer) {
this->CUDie->addChild(Buffer);
}
DIE *getIndexTyDie() {
return IndexTyDie;
}
void setIndexTyDie(DIE *D) {
IndexTyDie = D;
}
public:
void addUInt(DIE *Die, unsigned Attribute, unsigned Form, uint64_t Integer);
void addSInt(DIE *Die, unsigned Attribute, unsigned Form, int64_t Integer);
void addString(DIE *Die, unsigned Attribute, const StringRef Str);
void addLabel(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Label);
void addDelta(DIE *Die, unsigned Attribute, unsigned Form,
const MCSymbol *Hi, const MCSymbol *Lo);
void addDIEEntry(DIE *Die, unsigned Attribute, unsigned Form, DIE *Entry);
void addBlock(DIE *Die, unsigned Attribute, unsigned Form, DIEBlock *Block);
void addSourceLine(DIE *Die, DIVariable V);
void addSourceLine(DIE *Die, DIGlobalVariable G);
void addSourceLine(DIE *Die, DISubprogram SP);
void addSourceLine(DIE *Die, DIType Ty);
void addSourceLine(DIE *Die, DINameSpace NS);
void addSourceLine(DIE *Die, DIObjCProperty Ty);
void addAddress(DIE *Die, unsigned Attribute,
const MachineLocation &Location);
bool addConstantValue(DIE *Die, const MachineOperand &MO, DIType Ty);
bool addConstantValue(DIE *Die, const ConstantInt *CI, bool Unsigned);
bool addConstantFPValue(DIE *Die, const MachineOperand &MO);
void addTemplateParams(DIE &Buffer, DIArray TParams);
void addRegisterOp(DIE *TheDie, unsigned Reg);
void addRegisterOffset(DIE *TheDie, unsigned Reg, int64_t Offset);
void addComplexAddress(DbgVariable *&DV, DIE *Die, unsigned Attribute,
const MachineLocation &Location);
void addBlockByrefAddress(DbgVariable *&DV, DIE *Die, unsigned Attribute,
const MachineLocation &Location);
void addVariableAddress(DbgVariable *&DV, DIE *Die, MachineLocation Location);
void addToContextOwner(DIE *Die, DIDescriptor Context);
void addType(DIE *Entity, DIType Ty);
DIE *getOrCreateNameSpace(DINameSpace NS);
DIE *getOrCreateSubprogramDIE(DISubprogram SP);
DIE *getOrCreateTypeDIE(const MDNode *N);
DIE *getOrCreateTemplateTypeParameterDIE(DITemplateTypeParameter TP);
DIE *getOrCreateTemplateValueParameterDIE(DITemplateValueParameter TVP);
DIEEntry *createDIEEntry(DIE *Entry);
void createGlobalVariableDIE(const MDNode *N);
void addPubTypes(DISubprogram SP);
void constructTypeDIE(DIE &Buffer,
DIBasicType BTy);
void constructTypeDIE(DIE &Buffer,
DIDerivedType DTy);
void constructTypeDIE(DIE &Buffer,
DICompositeType CTy);
void constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy);
void constructArrayTypeDIE(DIE &Buffer,
DICompositeType *CTy);
DIE *constructEnumTypeDIE(DIEnumerator ETy);
void constructContainingTypeDIEs();
DIE *constructVariableDIE(DbgVariable *DV, bool isScopeAbstract);
DIE *createMemberDIE(DIDerivedType DT);
private:
BumpPtrAllocator DIEValueAllocator;
DIEInteger *DIEIntegerOne;
};
} #endif