mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-29 22:52:18 +00:00
Remove DIFactory. Patch by Devang.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126871 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7e33418671
commit
291bb70d93
@ -666,214 +666,6 @@ namespace llvm {
|
||||
bool Verify() const;
|
||||
};
|
||||
|
||||
/// DIFactory - This object assists with the construction of the various
|
||||
/// descriptors.
|
||||
class DIFactory {
|
||||
Module &M;
|
||||
LLVMContext& VMContext;
|
||||
|
||||
Function *DeclareFn; // llvm.dbg.declare
|
||||
Function *ValueFn; // llvm.dbg.value
|
||||
|
||||
DIFactory(const DIFactory &); // DO NOT IMPLEMENT
|
||||
void operator=(const DIFactory&); // DO NOT IMPLEMENT
|
||||
public:
|
||||
enum ComplexAddrKind { OpPlus=1, OpDeref };
|
||||
|
||||
explicit DIFactory(Module &m);
|
||||
|
||||
/// GetOrCreateArray - Create an descriptor for an array of descriptors.
|
||||
/// This implicitly uniques the arrays created.
|
||||
DIArray GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys);
|
||||
|
||||
/// GetOrCreateSubrange - Create a descriptor for a value range. This
|
||||
/// implicitly uniques the values returned.
|
||||
DISubrange GetOrCreateSubrange(int64_t Lo, int64_t Hi);
|
||||
|
||||
/// CreateUnspecifiedParameter - Create unspeicified type descriptor
|
||||
/// for a subroutine type.
|
||||
DIDescriptor CreateUnspecifiedParameter();
|
||||
|
||||
/// CreateCompileUnit - Create a new descriptor for the specified compile
|
||||
/// unit.
|
||||
DICompileUnit CreateCompileUnit(unsigned LangID,
|
||||
StringRef Filename,
|
||||
StringRef Directory,
|
||||
StringRef Producer,
|
||||
bool isMain = false,
|
||||
bool isOptimized = false,
|
||||
StringRef Flags = "",
|
||||
unsigned RunTimeVer = 0);
|
||||
|
||||
/// CreateFile - Create a new descriptor for the specified file.
|
||||
DIFile CreateFile(StringRef Filename, StringRef Directory,
|
||||
DICompileUnit CU);
|
||||
|
||||
/// CreateEnumerator - Create a single enumerator value.
|
||||
DIEnumerator CreateEnumerator(StringRef Name, uint64_t Val);
|
||||
|
||||
/// CreateBasicType - Create a basic type like int, float, etc.
|
||||
DIBasicType CreateBasicType(DIDescriptor Context, StringRef Name,
|
||||
DIFile F, unsigned LineNumber,
|
||||
uint64_t SizeInBits, uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits, unsigned Flags,
|
||||
unsigned Encoding);
|
||||
|
||||
/// CreateBasicType - Create a basic type like int, float, etc.
|
||||
DIBasicType CreateBasicTypeEx(DIDescriptor Context, StringRef Name,
|
||||
DIFile F, unsigned LineNumber,
|
||||
Constant *SizeInBits, Constant *AlignInBits,
|
||||
Constant *OffsetInBits, unsigned Flags,
|
||||
unsigned Encoding);
|
||||
|
||||
/// CreateDerivedType - Create a derived type like const qualified type,
|
||||
/// pointer, typedef, etc.
|
||||
DIDerivedType CreateDerivedType(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
uint64_t SizeInBits, uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits, unsigned Flags,
|
||||
DIType DerivedFrom);
|
||||
|
||||
/// CreateDerivedType - Create a derived type like const qualified type,
|
||||
/// pointer, typedef, etc.
|
||||
DIDerivedType CreateDerivedTypeEx(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
Constant *SizeInBits,
|
||||
Constant *AlignInBits,
|
||||
Constant *OffsetInBits, unsigned Flags,
|
||||
DIType DerivedFrom);
|
||||
|
||||
/// CreateCompositeType - Create a composite type like array, struct, etc.
|
||||
DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
uint64_t SizeInBits,
|
||||
uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits, unsigned Flags,
|
||||
DIType DerivedFrom,
|
||||
DIArray Elements,
|
||||
unsigned RunTimeLang = 0,
|
||||
MDNode *ContainingType = 0);
|
||||
|
||||
/// CreateTemporaryType - Create a temporary forward-declared type.
|
||||
DIType CreateTemporaryType();
|
||||
DIType CreateTemporaryType(DIFile F);
|
||||
|
||||
/// CreateArtificialType - Create a new DIType with "artificial" flag set.
|
||||
DIType CreateArtificialType(DIType Ty);
|
||||
|
||||
/// CreateCompositeType - Create a composite type like array, struct, etc.
|
||||
DICompositeType CreateCompositeTypeEx(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
Constant *SizeInBits,
|
||||
Constant *AlignInBits,
|
||||
Constant *OffsetInBits,
|
||||
unsigned Flags,
|
||||
DIType DerivedFrom,
|
||||
DIArray Elements,
|
||||
unsigned RunTimeLang = 0,
|
||||
MDNode *ContainingType = 0);
|
||||
|
||||
/// CreateSubprogram - Create a new descriptor for the specified subprogram.
|
||||
/// See comments in DISubprogram for descriptions of these fields.
|
||||
DISubprogram CreateSubprogram(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F, unsigned LineNo,
|
||||
DIType Ty, bool isLocalToUnit,
|
||||
bool isDefinition,
|
||||
unsigned VK = 0,
|
||||
unsigned VIndex = 0,
|
||||
DIType ContainingType = DIType(),
|
||||
unsigned Flags = 0,
|
||||
bool isOptimized = false,
|
||||
Function *Fn = 0);
|
||||
|
||||
/// CreateSubprogramDefinition - Create new subprogram descriptor for the
|
||||
/// given declaration.
|
||||
DISubprogram CreateSubprogramDefinition(DISubprogram &SPDeclaration);
|
||||
|
||||
/// CreateGlobalVariable - Create a new descriptor for the specified global.
|
||||
DIGlobalVariable
|
||||
CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty, bool isLocalToUnit,
|
||||
bool isDefinition, llvm::GlobalVariable *GV);
|
||||
|
||||
/// CreateGlobalVariable - Create a new descriptor for the specified constant.
|
||||
DIGlobalVariable
|
||||
CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty, bool isLocalToUnit,
|
||||
bool isDefinition, llvm::Constant *C);
|
||||
|
||||
/// CreateVariable - Create a new descriptor for the specified variable.
|
||||
DIVariable CreateVariable(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F, unsigned LineNo,
|
||||
DIType Ty, bool AlwaysPreserve = false,
|
||||
unsigned Flags = 0);
|
||||
|
||||
/// CreateComplexVariable - Create a new descriptor for the specified
|
||||
/// variable which has a complex address expression for its address.
|
||||
DIVariable CreateComplexVariable(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name, DIFile F, unsigned LineNo,
|
||||
DIType Ty, Value *const *Addr,
|
||||
unsigned NumAddr);
|
||||
|
||||
/// CreateLexicalBlock - This creates a descriptor for a lexical block
|
||||
/// with the specified parent context.
|
||||
DILexicalBlock CreateLexicalBlock(DIDescriptor Context, DIFile F,
|
||||
unsigned Line = 0, unsigned Col = 0);
|
||||
|
||||
/// CreateNameSpace - This creates new descriptor for a namespace
|
||||
/// with the specified parent context.
|
||||
DINameSpace CreateNameSpace(DIDescriptor Context, StringRef Name,
|
||||
DIFile F, unsigned LineNo);
|
||||
|
||||
/// CreateLocation - Creates a debug info location.
|
||||
DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
|
||||
DIScope S, DILocation OrigLoc);
|
||||
|
||||
/// CreateLocation - Creates a debug info location.
|
||||
DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
|
||||
DIScope S, MDNode *OrigLoc = 0);
|
||||
|
||||
/// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
|
||||
Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
|
||||
BasicBlock *InsertAtEnd);
|
||||
|
||||
/// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
|
||||
Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
|
||||
Instruction *InsertBefore);
|
||||
|
||||
/// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
|
||||
Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
|
||||
DIVariable D, BasicBlock *InsertAtEnd);
|
||||
|
||||
/// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
|
||||
Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
|
||||
DIVariable D, Instruction *InsertBefore);
|
||||
|
||||
// RecordType - Record DIType in a module such that it is not lost even if
|
||||
// it is not referenced through debug info anchors.
|
||||
void RecordType(DIType T);
|
||||
|
||||
private:
|
||||
Constant *GetTagConstant(unsigned TAG);
|
||||
};
|
||||
|
||||
/// getDISubprogram - Find subprogram that is enclosing this scope.
|
||||
DISubprogram getDISubprogram(const MDNode *Scope);
|
||||
|
||||
|
@ -725,484 +725,6 @@ void DIVariable::dump() const {
|
||||
print(dbgs()); dbgs() << '\n';
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DIFactory: Basic Helpers
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
DIFactory::DIFactory(Module &m)
|
||||
: M(m), VMContext(M.getContext()), DeclareFn(0), ValueFn(0) {}
|
||||
|
||||
Constant *DIFactory::GetTagConstant(unsigned TAG) {
|
||||
assert((TAG & LLVMDebugVersionMask) == 0 &&
|
||||
"Tag too large for debug encoding!");
|
||||
return ConstantInt::get(Type::getInt32Ty(VMContext), TAG | LLVMDebugVersion);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DIFactory: Primary Constructors
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// GetOrCreateArray - Create an descriptor for an array of descriptors.
|
||||
/// This implicitly uniques the arrays created.
|
||||
DIArray DIFactory::GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys) {
|
||||
if (NumTys == 0) {
|
||||
Value *Null = llvm::Constant::getNullValue(Type::getInt32Ty(VMContext));
|
||||
return DIArray(MDNode::get(VMContext, &Null, 1));
|
||||
}
|
||||
|
||||
SmallVector<Value *, 16> Elts(Tys, Tys+NumTys);
|
||||
return DIArray(MDNode::get(VMContext, Elts.data(), Elts.size()));
|
||||
}
|
||||
|
||||
/// GetOrCreateSubrange - Create a descriptor for a value range. This
|
||||
/// implicitly uniques the values returned.
|
||||
DISubrange DIFactory::GetOrCreateSubrange(int64_t Lo, int64_t Hi) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_subrange_type),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), Lo),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), Hi)
|
||||
};
|
||||
|
||||
return DISubrange(MDNode::get(VMContext, &Elts[0], 3));
|
||||
}
|
||||
|
||||
/// CreateUnspecifiedParameter - Create unspeicified type descriptor
|
||||
/// for the subroutine type.
|
||||
DIDescriptor DIFactory::CreateUnspecifiedParameter() {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_unspecified_parameters)
|
||||
};
|
||||
return DIDescriptor(MDNode::get(VMContext, &Elts[0], 1));
|
||||
}
|
||||
|
||||
/// CreateCompileUnit - Create a new descriptor for the specified compile
|
||||
/// unit. Note that this does not unique compile units within the module.
|
||||
DICompileUnit DIFactory::CreateCompileUnit(unsigned LangID,
|
||||
StringRef Filename,
|
||||
StringRef Directory,
|
||||
StringRef Producer,
|
||||
bool isMain,
|
||||
bool isOptimized,
|
||||
StringRef Flags,
|
||||
unsigned RunTimeVer) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_compile_unit),
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LangID),
|
||||
MDString::get(VMContext, Filename),
|
||||
MDString::get(VMContext, Directory),
|
||||
MDString::get(VMContext, Producer),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isMain),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
|
||||
MDString::get(VMContext, Flags),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), RunTimeVer)
|
||||
};
|
||||
|
||||
return DICompileUnit(MDNode::get(VMContext, &Elts[0], 10));
|
||||
}
|
||||
|
||||
/// CreateFile - Create a new descriptor for the specified file.
|
||||
DIFile DIFactory::CreateFile(StringRef Filename,
|
||||
StringRef Directory,
|
||||
DICompileUnit CU) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_file_type),
|
||||
MDString::get(VMContext, Filename),
|
||||
MDString::get(VMContext, Directory),
|
||||
CU
|
||||
};
|
||||
|
||||
return DIFile(MDNode::get(VMContext, &Elts[0], 4));
|
||||
}
|
||||
|
||||
/// CreateEnumerator - Create a single enumerator value.
|
||||
DIEnumerator DIFactory::CreateEnumerator(StringRef Name, uint64_t Val){
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_enumerator),
|
||||
MDString::get(VMContext, Name),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), Val)
|
||||
};
|
||||
return DIEnumerator(MDNode::get(VMContext, &Elts[0], 3));
|
||||
}
|
||||
|
||||
|
||||
/// CreateBasicType - Create a basic type like int, float, etc.
|
||||
DIBasicType DIFactory::CreateBasicType(DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
uint64_t SizeInBits,
|
||||
uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits, unsigned Flags,
|
||||
unsigned Encoding) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_base_type),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
|
||||
};
|
||||
return DIBasicType(MDNode::get(VMContext, &Elts[0], 10));
|
||||
}
|
||||
|
||||
|
||||
/// CreateBasicType - Create a basic type like int, float, etc.
|
||||
DIBasicType DIFactory::CreateBasicTypeEx(DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
Constant *SizeInBits,
|
||||
Constant *AlignInBits,
|
||||
Constant *OffsetInBits, unsigned Flags,
|
||||
unsigned Encoding) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_base_type),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
SizeInBits,
|
||||
AlignInBits,
|
||||
OffsetInBits,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Encoding)
|
||||
};
|
||||
return DIBasicType(MDNode::get(VMContext, &Elts[0], 10));
|
||||
}
|
||||
|
||||
/// CreateArtificialType - Create a new DIType with "artificial" flag set.
|
||||
DIType DIFactory::CreateArtificialType(DIType Ty) {
|
||||
if (Ty.isArtificial())
|
||||
return Ty;
|
||||
|
||||
SmallVector<Value *, 9> Elts;
|
||||
MDNode *N = Ty;
|
||||
assert (N && "Unexpected input DIType!");
|
||||
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
|
||||
if (Value *V = N->getOperand(i))
|
||||
Elts.push_back(V);
|
||||
else
|
||||
Elts.push_back(Constant::getNullValue(Type::getInt32Ty(VMContext)));
|
||||
}
|
||||
|
||||
unsigned CurFlags = Ty.getFlags();
|
||||
CurFlags = CurFlags | DIType::FlagArtificial;
|
||||
|
||||
// Flags are stored at this slot.
|
||||
Elts[8] = ConstantInt::get(Type::getInt32Ty(VMContext), CurFlags);
|
||||
|
||||
return DIType(MDNode::get(VMContext, Elts.data(), Elts.size()));
|
||||
}
|
||||
|
||||
/// CreateDerivedType - Create a derived type like const qualified type,
|
||||
/// pointer, typedef, etc.
|
||||
DIDerivedType DIFactory::CreateDerivedType(unsigned Tag,
|
||||
DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
uint64_t SizeInBits,
|
||||
uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits,
|
||||
unsigned Flags,
|
||||
DIType DerivedFrom) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(Tag),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
DerivedFrom,
|
||||
};
|
||||
return DIDerivedType(MDNode::get(VMContext, &Elts[0], 10));
|
||||
}
|
||||
|
||||
|
||||
/// CreateDerivedType - Create a derived type like const qualified type,
|
||||
/// pointer, typedef, etc.
|
||||
DIDerivedType DIFactory::CreateDerivedTypeEx(unsigned Tag,
|
||||
DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
Constant *SizeInBits,
|
||||
Constant *AlignInBits,
|
||||
Constant *OffsetInBits,
|
||||
unsigned Flags,
|
||||
DIType DerivedFrom) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(Tag),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
SizeInBits,
|
||||
AlignInBits,
|
||||
OffsetInBits,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
DerivedFrom,
|
||||
};
|
||||
return DIDerivedType(MDNode::get(VMContext, &Elts[0], 10));
|
||||
}
|
||||
|
||||
|
||||
/// CreateCompositeType - Create a composite type like array, struct, etc.
|
||||
DICompositeType DIFactory::CreateCompositeType(unsigned Tag,
|
||||
DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
uint64_t SizeInBits,
|
||||
uint64_t AlignInBits,
|
||||
uint64_t OffsetInBits,
|
||||
unsigned Flags,
|
||||
DIType DerivedFrom,
|
||||
DIArray Elements,
|
||||
unsigned RuntimeLang,
|
||||
MDNode *ContainingType) {
|
||||
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(Tag),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), SizeInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), AlignInBits),
|
||||
ConstantInt::get(Type::getInt64Ty(VMContext), OffsetInBits),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
DerivedFrom,
|
||||
Elements,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang),
|
||||
ContainingType
|
||||
};
|
||||
|
||||
MDNode *Node = MDNode::get(VMContext, &Elts[0], 13);
|
||||
// Create a named metadata so that we do not lose this enum info.
|
||||
if (Tag == dwarf::DW_TAG_enumeration_type) {
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.enum");
|
||||
NMD->addOperand(Node);
|
||||
}
|
||||
return DICompositeType(Node);
|
||||
}
|
||||
|
||||
/// CreateTemporaryType - Create a temporary forward-declared type.
|
||||
DIType DIFactory::CreateTemporaryType() {
|
||||
// Give the temporary MDNode a tag. It doesn't matter what tag we
|
||||
// use here as long as DIType accepts it.
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(DW_TAG_base_type)
|
||||
};
|
||||
MDNode *Node = MDNode::getTemporary(VMContext, Elts, array_lengthof(Elts));
|
||||
return DIType(Node);
|
||||
}
|
||||
|
||||
/// CreateTemporaryType - Create a temporary forward-declared type.
|
||||
DIType DIFactory::CreateTemporaryType(DIFile F) {
|
||||
// Give the temporary MDNode a tag. It doesn't matter what tag we
|
||||
// use here as long as DIType accepts it.
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(DW_TAG_base_type),
|
||||
F.getCompileUnit(),
|
||||
NULL,
|
||||
F
|
||||
};
|
||||
MDNode *Node = MDNode::getTemporary(VMContext, Elts, array_lengthof(Elts));
|
||||
return DIType(Node);
|
||||
}
|
||||
|
||||
/// CreateCompositeType - Create a composite type like array, struct, etc.
|
||||
DICompositeType DIFactory::CreateCompositeTypeEx(unsigned Tag,
|
||||
DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNumber,
|
||||
Constant *SizeInBits,
|
||||
Constant *AlignInBits,
|
||||
Constant *OffsetInBits,
|
||||
unsigned Flags,
|
||||
DIType DerivedFrom,
|
||||
DIArray Elements,
|
||||
unsigned RuntimeLang,
|
||||
MDNode *ContainingType) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(Tag),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNumber),
|
||||
SizeInBits,
|
||||
AlignInBits,
|
||||
OffsetInBits,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
DerivedFrom,
|
||||
Elements,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), RuntimeLang),
|
||||
ContainingType
|
||||
};
|
||||
MDNode *Node = MDNode::get(VMContext, &Elts[0], 13);
|
||||
// Create a named metadata so that we do not lose this enum info.
|
||||
if (Tag == dwarf::DW_TAG_enumeration_type) {
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.enum");
|
||||
NMD->addOperand(Node);
|
||||
}
|
||||
return DICompositeType(Node);
|
||||
}
|
||||
|
||||
|
||||
/// CreateSubprogram - Create a new descriptor for the specified subprogram.
|
||||
/// See comments in DISubprogram for descriptions of these fields. This
|
||||
/// method does not unique the generated descriptors.
|
||||
DISubprogram DIFactory::CreateSubprogram(DIDescriptor Context,
|
||||
StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty,
|
||||
bool isLocalToUnit,
|
||||
bool isDefinition,
|
||||
unsigned VK, unsigned VIndex,
|
||||
DIType ContainingType,
|
||||
unsigned Flags,
|
||||
bool isOptimized,
|
||||
Function *Fn) {
|
||||
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_subprogram),
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
MDString::get(VMContext, DisplayName),
|
||||
MDString::get(VMContext, LinkageName),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
Ty,
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), (unsigned)VK),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), VIndex),
|
||||
ContainingType,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isOptimized),
|
||||
Fn
|
||||
};
|
||||
MDNode *Node = MDNode::get(VMContext, &Elts[0], 17);
|
||||
|
||||
// Create a named metadata so that we do not lose this mdnode.
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp");
|
||||
NMD->addOperand(Node);
|
||||
return DISubprogram(Node);
|
||||
}
|
||||
|
||||
/// CreateSubprogramDefinition - Create new subprogram descriptor for the
|
||||
/// given declaration.
|
||||
DISubprogram DIFactory::CreateSubprogramDefinition(DISubprogram &SPDeclaration){
|
||||
if (SPDeclaration.isDefinition())
|
||||
return DISubprogram(SPDeclaration);
|
||||
|
||||
MDNode *DeclNode = SPDeclaration;
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_subprogram),
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
DeclNode->getOperand(2), // Context
|
||||
DeclNode->getOperand(3), // Name
|
||||
DeclNode->getOperand(4), // DisplayName
|
||||
DeclNode->getOperand(5), // LinkageName
|
||||
DeclNode->getOperand(6), // CompileUnit
|
||||
DeclNode->getOperand(7), // LineNo
|
||||
DeclNode->getOperand(8), // Type
|
||||
DeclNode->getOperand(9), // isLocalToUnit
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), true),
|
||||
DeclNode->getOperand(11), // Virtuality
|
||||
DeclNode->getOperand(12), // VIndex
|
||||
DeclNode->getOperand(13), // Containting Type
|
||||
DeclNode->getOperand(14), // Flags
|
||||
DeclNode->getOperand(15), // isOptimized
|
||||
SPDeclaration.getFunction()
|
||||
};
|
||||
MDNode *Node =MDNode::get(VMContext, &Elts[0], 16);
|
||||
|
||||
// Create a named metadata so that we do not lose this mdnode.
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.sp");
|
||||
NMD->addOperand(Node);
|
||||
return DISubprogram(Node);
|
||||
}
|
||||
|
||||
/// CreateGlobalVariable - Create a new descriptor for the specified global.
|
||||
DIGlobalVariable
|
||||
DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty,bool isLocalToUnit,
|
||||
bool isDefinition, llvm::GlobalVariable *Val) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_variable),
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
MDString::get(VMContext, DisplayName),
|
||||
MDString::get(VMContext, LinkageName),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
Ty,
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
|
||||
Val
|
||||
};
|
||||
|
||||
Value *const *Vs = &Elts[0];
|
||||
MDNode *Node = MDNode::get(VMContext,Vs, 12);
|
||||
|
||||
// Create a named metadata so that we do not lose this mdnode.
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv");
|
||||
NMD->addOperand(Node);
|
||||
|
||||
return DIGlobalVariable(Node);
|
||||
}
|
||||
|
||||
/// CreateGlobalVariable - Create a new descriptor for the specified constant.
|
||||
DIGlobalVariable
|
||||
DIFactory::CreateGlobalVariable(DIDescriptor Context, StringRef Name,
|
||||
StringRef DisplayName,
|
||||
StringRef LinkageName,
|
||||
DIFile F,
|
||||
unsigned LineNo, DIType Ty,bool isLocalToUnit,
|
||||
bool isDefinition, llvm::Constant *Val) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_variable),
|
||||
llvm::Constant::getNullValue(Type::getInt32Ty(VMContext)),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
MDString::get(VMContext, DisplayName),
|
||||
MDString::get(VMContext, LinkageName),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
Ty,
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isLocalToUnit),
|
||||
ConstantInt::get(Type::getInt1Ty(VMContext), isDefinition),
|
||||
Val
|
||||
};
|
||||
|
||||
Value *const *Vs = &Elts[0];
|
||||
MDNode *Node = MDNode::get(VMContext,Vs, 12);
|
||||
|
||||
// Create a named metadata so that we do not lose this mdnode.
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.gv");
|
||||
NMD->addOperand(Node);
|
||||
|
||||
return DIGlobalVariable(Node);
|
||||
}
|
||||
|
||||
/// fixupObjcLikeName - Replace contains special characters used
|
||||
/// in a typical Objective-C names with '.' in a given string.
|
||||
static void fixupObjcLikeName(std::string &Str) {
|
||||
@ -1214,19 +736,6 @@ static void fixupObjcLikeName(std::string &Str) {
|
||||
}
|
||||
}
|
||||
|
||||
/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
|
||||
/// to hold function specific information.
|
||||
NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) {
|
||||
SmallString<32> Out;
|
||||
if (FuncName.find('[') == StringRef::npos)
|
||||
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName)
|
||||
.toStringRef(Out));
|
||||
std::string Name = FuncName;
|
||||
fixupObjcLikeName(Name);
|
||||
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name)
|
||||
.toStringRef(Out));
|
||||
}
|
||||
|
||||
/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
|
||||
/// suitable to hold function specific information.
|
||||
NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {
|
||||
@ -1237,178 +746,18 @@ NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {
|
||||
return M.getNamedMetadata(Twine("llvm.dbg.lv.", Name));
|
||||
}
|
||||
|
||||
/// CreateVariable - Create a new descriptor for the specified variable.
|
||||
DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNo,
|
||||
DIType Ty, bool AlwaysPreserve,
|
||||
unsigned Flags) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(Tag),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
Ty,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Flags)
|
||||
};
|
||||
MDNode *Node = MDNode::get(VMContext, &Elts[0], 7);
|
||||
if (AlwaysPreserve) {
|
||||
// The optimizer may remove local variable. If there is an interest
|
||||
// to preserve variable info in such situation then stash it in a
|
||||
// named mdnode.
|
||||
DISubprogram Fn(getDISubprogram(Context));
|
||||
StringRef FName = "fn";
|
||||
if (Fn.getFunction())
|
||||
FName = Fn.getFunction()->getName();
|
||||
char One = '\1';
|
||||
if (FName.startswith(StringRef(&One, 1)))
|
||||
FName = FName.substr(1);
|
||||
|
||||
|
||||
NamedMDNode *FnLocals = getOrInsertFnSpecificMDNode(M, FName);
|
||||
FnLocals->addOperand(Node);
|
||||
}
|
||||
return DIVariable(Node);
|
||||
}
|
||||
|
||||
|
||||
/// CreateComplexVariable - Create a new descriptor for the specified variable
|
||||
/// which has a complex address expression for its address.
|
||||
DIVariable DIFactory::CreateComplexVariable(unsigned Tag, DIDescriptor Context,
|
||||
StringRef Name, DIFile F,
|
||||
unsigned LineNo,
|
||||
DIType Ty, Value *const *Addr,
|
||||
unsigned NumAddr) {
|
||||
SmallVector<Value *, 15> Elts;
|
||||
Elts.push_back(GetTagConstant(Tag));
|
||||
Elts.push_back(Context);
|
||||
Elts.push_back(MDString::get(VMContext, Name));
|
||||
Elts.push_back(F);
|
||||
Elts.push_back(ConstantInt::get(Type::getInt32Ty(VMContext), LineNo));
|
||||
Elts.push_back(Ty);
|
||||
Elts.append(Addr, Addr+NumAddr);
|
||||
|
||||
return DIVariable(MDNode::get(VMContext, Elts.data(), Elts.size()));
|
||||
}
|
||||
|
||||
|
||||
/// CreateBlock - This creates a descriptor for a lexical block with the
|
||||
/// specified parent VMContext.
|
||||
DILexicalBlock DIFactory::CreateLexicalBlock(DIDescriptor Context,
|
||||
DIFile F, unsigned LineNo,
|
||||
unsigned Col) {
|
||||
// Defeat MDNode uniqing for lexical blocks.
|
||||
static unsigned int unique_id = 0;
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_lexical_block),
|
||||
Context,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), Col),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), unique_id++)
|
||||
};
|
||||
return DILexicalBlock(MDNode::get(VMContext, &Elts[0], 6));
|
||||
}
|
||||
|
||||
/// CreateNameSpace - This creates new descriptor for a namespace
|
||||
/// with the specified parent context.
|
||||
DINameSpace DIFactory::CreateNameSpace(DIDescriptor Context, StringRef Name,
|
||||
DIFile F,
|
||||
unsigned LineNo) {
|
||||
Value *Elts[] = {
|
||||
GetTagConstant(dwarf::DW_TAG_namespace),
|
||||
Context,
|
||||
MDString::get(VMContext, Name),
|
||||
F,
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo)
|
||||
};
|
||||
return DINameSpace(MDNode::get(VMContext, &Elts[0], 5));
|
||||
}
|
||||
|
||||
/// CreateLocation - Creates a debug info location.
|
||||
DILocation DIFactory::CreateLocation(unsigned LineNo, unsigned ColumnNo,
|
||||
DIScope S, DILocation OrigLoc) {
|
||||
Value *Elts[] = {
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), LineNo),
|
||||
ConstantInt::get(Type::getInt32Ty(VMContext), ColumnNo),
|
||||
S,
|
||||
OrigLoc,
|
||||
};
|
||||
return DILocation(MDNode::get(VMContext, &Elts[0], 4));
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// DIFactory: Routines for inserting code into a function
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
|
||||
Instruction *DIFactory::InsertDeclare(Value *Storage, DIVariable D,
|
||||
Instruction *InsertBefore) {
|
||||
assert(Storage && "no storage passed to dbg.declare");
|
||||
assert(D.Verify() && "empty DIVariable passed to dbg.declare");
|
||||
if (!DeclareFn)
|
||||
DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
|
||||
|
||||
Value *Args[] = { MDNode::get(Storage->getContext(), &Storage, 1),
|
||||
D };
|
||||
return CallInst::Create(DeclareFn, Args, Args+2, "", InsertBefore);
|
||||
}
|
||||
|
||||
/// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
|
||||
Instruction *DIFactory::InsertDeclare(Value *Storage, DIVariable D,
|
||||
BasicBlock *InsertAtEnd) {
|
||||
assert(Storage && "no storage passed to dbg.declare");
|
||||
assert(D.Verify() && "invalid DIVariable passed to dbg.declare");
|
||||
if (!DeclareFn)
|
||||
DeclareFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
|
||||
|
||||
Value *Args[] = { MDNode::get(Storage->getContext(), &Storage, 1),
|
||||
D };
|
||||
|
||||
// If this block already has a terminator then insert this intrinsic
|
||||
// before the terminator.
|
||||
if (TerminatorInst *T = InsertAtEnd->getTerminator())
|
||||
return CallInst::Create(DeclareFn, Args, Args+2, "", T);
|
||||
else
|
||||
return CallInst::Create(DeclareFn, Args, Args+2, "", InsertAtEnd);}
|
||||
|
||||
/// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
|
||||
Instruction *DIFactory::InsertDbgValueIntrinsic(Value *V, uint64_t Offset,
|
||||
DIVariable D,
|
||||
Instruction *InsertBefore) {
|
||||
assert(V && "no value passed to dbg.value");
|
||||
assert(D.Verify() && "invalid DIVariable passed to dbg.value");
|
||||
if (!ValueFn)
|
||||
ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
|
||||
|
||||
Value *Args[] = { MDNode::get(V->getContext(), &V, 1),
|
||||
ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
|
||||
D };
|
||||
return CallInst::Create(ValueFn, Args, Args+3, "", InsertBefore);
|
||||
}
|
||||
|
||||
/// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
|
||||
Instruction *DIFactory::InsertDbgValueIntrinsic(Value *V, uint64_t Offset,
|
||||
DIVariable D,
|
||||
BasicBlock *InsertAtEnd) {
|
||||
assert(V && "no value passed to dbg.value");
|
||||
assert(D.Verify() && "invalid DIVariable passed to dbg.value");
|
||||
if (!ValueFn)
|
||||
ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value);
|
||||
|
||||
Value *Args[] = { MDNode::get(V->getContext(), &V, 1),
|
||||
ConstantInt::get(Type::getInt64Ty(V->getContext()), Offset),
|
||||
D };
|
||||
return CallInst::Create(ValueFn, Args, Args+3, "", InsertAtEnd);
|
||||
}
|
||||
|
||||
// RecordType - Record DIType in a module such that it is not lost even if
|
||||
// it is not referenced through debug info anchors.
|
||||
void DIFactory::RecordType(DIType T) {
|
||||
NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.ty");
|
||||
NMD->addOperand(T);
|
||||
/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
|
||||
/// to hold function specific information.
|
||||
NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) {
|
||||
SmallString<32> Out;
|
||||
if (FuncName.find('[') == StringRef::npos)
|
||||
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName)
|
||||
.toStringRef(Out));
|
||||
|
||||
std::string Name = FuncName;
|
||||
fixupObjcLikeName(Name);
|
||||
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name)
|
||||
.toStringRef(Out));
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user