forked from OSchip/llvm-project
parent
ff9890302c
commit
bf577d6a86
|
@ -666,214 +666,6 @@ namespace llvm {
|
||||||
bool Verify() const;
|
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.
|
/// getDISubprogram - Find subprogram that is enclosing this scope.
|
||||||
DISubprogram getDISubprogram(const MDNode *Scope);
|
DISubprogram getDISubprogram(const MDNode *Scope);
|
||||||
|
|
||||||
|
|
|
@ -725,484 +725,6 @@ void DIVariable::dump() const {
|
||||||
print(dbgs()); dbgs() << '\n';
|
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
|
/// fixupObjcLikeName - Replace contains special characters used
|
||||||
/// in a typical Objective-C names with '.' in a given string.
|
/// in a typical Objective-C names with '.' in a given string.
|
||||||
static void fixupObjcLikeName(std::string &Str) {
|
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
|
/// getFnSpecificMDNode - Return a NameMDNode, if available, that is
|
||||||
/// suitable to hold function specific information.
|
/// suitable to hold function specific information.
|
||||||
NamedMDNode *llvm::getFnSpecificMDNode(const Module &M, StringRef FuncName) {
|
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));
|
return M.getNamedMetadata(Twine("llvm.dbg.lv.", Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// CreateVariable - Create a new descriptor for the specified variable.
|
/// getOrInsertFnSpecificMDNode - Return a NameMDNode that is suitable
|
||||||
DIVariable DIFactory::CreateVariable(unsigned Tag, DIDescriptor Context,
|
/// to hold function specific information.
|
||||||
StringRef Name,
|
NamedMDNode *llvm::getOrInsertFnSpecificMDNode(Module &M, StringRef FuncName) {
|
||||||
DIFile F,
|
SmallString<32> Out;
|
||||||
unsigned LineNo,
|
if (FuncName.find('[') == StringRef::npos)
|
||||||
DIType Ty, bool AlwaysPreserve,
|
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", FuncName)
|
||||||
unsigned Flags) {
|
.toStringRef(Out));
|
||||||
Value *Elts[] = {
|
|
||||||
GetTagConstant(Tag),
|
std::string Name = FuncName;
|
||||||
Context,
|
fixupObjcLikeName(Name);
|
||||||
MDString::get(VMContext, Name),
|
return M.getOrInsertNamedMetadata(Twine("llvm.dbg.lv.", Name)
|
||||||
F,
|
.toStringRef(Out));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue