forked from OSchip/llvm-project
[LLVM-C] Move DIBuilder Bindings For Temporary MDNodes
Summary: Move LLVMTemporaryMDNode and LLVMMetadataReplaceAllUsesWith to the C bindings and add LLVMDeleteTemporaryMDNode for deleting non-RAUW'ed temporary nodes. Reviewers: whitequark, harlanhaskins, deadalnix Reviewed By: whitequark Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D46632 llvm-svn: 332010
This commit is contained in:
parent
262e09018b
commit
a428eba85e
|
@ -36,13 +36,6 @@ LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
|
||||||
MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count)));
|
MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count)));
|
||||||
}
|
}
|
||||||
|
|
||||||
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,
|
|
||||||
unsigned Count) {
|
|
||||||
return wrap(MDTuple::getTemporary(*unwrap(C),
|
|
||||||
ArrayRef<Metadata *>(unwrap(MDs), Count))
|
|
||||||
.release());
|
|
||||||
}
|
|
||||||
|
|
||||||
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
|
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
|
||||||
LLVMMetadataRef Val) {
|
LLVMMetadataRef Val) {
|
||||||
NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
|
NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
|
||||||
|
@ -58,12 +51,6 @@ void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) {
|
||||||
unwrap<Instruction>(Inst)->setMetadata(KindID, N);
|
unwrap<Instruction>(Inst)->setMetadata(KindID, N);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) {
|
|
||||||
auto *Node = unwrap<MDNode>(MD);
|
|
||||||
Node->replaceAllUsesWith(unwrap<Metadata>(New));
|
|
||||||
MDNode::deleteTemporary(Node);
|
|
||||||
}
|
|
||||||
|
|
||||||
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
|
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
|
||||||
unsigned Col, LLVMMetadataRef Scope,
|
unsigned Col, LLVMMetadataRef Scope,
|
||||||
LLVMMetadataRef InlinedAt) {
|
LLVMMetadataRef InlinedAt) {
|
||||||
|
|
|
@ -38,15 +38,11 @@ LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef Val);
|
||||||
LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen);
|
LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen);
|
||||||
LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
|
LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
|
||||||
unsigned Count);
|
unsigned Count);
|
||||||
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,
|
|
||||||
unsigned Count);
|
|
||||||
|
|
||||||
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
|
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
|
||||||
LLVMMetadataRef Val);
|
LLVMMetadataRef Val);
|
||||||
void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD);
|
void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD);
|
||||||
|
|
||||||
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New);
|
|
||||||
|
|
||||||
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
|
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
|
||||||
unsigned Col, LLVMMetadataRef Scope,
|
unsigned Col, LLVMMetadataRef Scope,
|
||||||
LLVMMetadataRef InlinedAt);
|
LLVMMetadataRef InlinedAt);
|
||||||
|
|
|
@ -585,3 +585,17 @@ func boolToCInt(v bool) C.int {
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
// llvm.Metadata
|
||||||
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
func (c Context) TemporaryMDNode(mds []Metadata) (md Metadata) {
|
||||||
|
ptr, nvals := llvmMetadataRefs(mds)
|
||||||
|
md.C = C.LLVMTemporaryMDNode(c.C, ptr, C.size_t(nvals))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (md Metadata) ReplaceAllUsesWith(new Metadata) {
|
||||||
|
C.LLVMMetadataReplaceAllUsesWith(md.C, new.C)
|
||||||
|
}
|
||||||
|
|
|
@ -784,11 +784,6 @@ func (c Context) MDNode(mds []Metadata) (md Metadata) {
|
||||||
md.C = C.LLVMMDNode2(c.C, ptr, nvals)
|
md.C = C.LLVMMDNode2(c.C, ptr, nvals)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
func (c Context) TemporaryMDNode(mds []Metadata) (md Metadata) {
|
|
||||||
ptr, nvals := llvmMetadataRefs(mds)
|
|
||||||
md.C = C.LLVMTemporaryMDNode(c.C, ptr, nvals)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
func (v Value) ConstantAsMetadata() (md Metadata) {
|
func (v Value) ConstantAsMetadata() (md Metadata) {
|
||||||
md.C = C.LLVMConstantAsMetadata(v.C)
|
md.C = C.LLVMConstantAsMetadata(v.C)
|
||||||
return
|
return
|
||||||
|
@ -1916,11 +1911,3 @@ func (pm PassManager) FinalizeFunc() bool { return C.LLVMFinalizeFunctionPassMan
|
||||||
// the module provider.
|
// the module provider.
|
||||||
// See llvm::PassManagerBase::~PassManagerBase.
|
// See llvm::PassManagerBase::~PassManagerBase.
|
||||||
func (pm PassManager) Dispose() { C.LLVMDisposePassManager(pm.C) }
|
func (pm PassManager) Dispose() { C.LLVMDisposePassManager(pm.C) }
|
||||||
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
// llvm.Metadata
|
|
||||||
//-------------------------------------------------------------------------
|
|
||||||
|
|
||||||
func (md Metadata) ReplaceAllUsesWith(new Metadata) {
|
|
||||||
C.LLVMMetadataReplaceAllUsesWith(md.C, new.C)
|
|
||||||
}
|
|
||||||
|
|
|
@ -830,6 +830,33 @@ LLVMDIBuilderCreateGlobalVariableExpression(LLVMDIBuilderRef Builder,
|
||||||
LLVMMetadataRef Expr,
|
LLVMMetadataRef Expr,
|
||||||
LLVMMetadataRef Decl,
|
LLVMMetadataRef Decl,
|
||||||
uint32_t AlignInBits);
|
uint32_t AlignInBits);
|
||||||
|
/**
|
||||||
|
* Create a new temporary \c MDNode. Suitable for use in constructing cyclic
|
||||||
|
* \c MDNode structures. A temporary \c MDNode is not uniqued, may be RAUW'd,
|
||||||
|
* and must be manually deleted with \c LLVMDisposeTemporaryMDNode.
|
||||||
|
* \param Ctx The context in which to construct the temporary node.
|
||||||
|
* \param Data The metadata elements.
|
||||||
|
* \param NumElements Number of metadata elements.
|
||||||
|
*/
|
||||||
|
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data,
|
||||||
|
size_t NumElements);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deallocate a temporary node.
|
||||||
|
*
|
||||||
|
* Calls \c replaceAllUsesWith(nullptr) before deleting, so any remaining
|
||||||
|
* references will be reset.
|
||||||
|
* \param TempNode The temporary metadata node.
|
||||||
|
*/
|
||||||
|
void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace all uses of temporary metadata.
|
||||||
|
* \param TempTargetMetadata The temporary metadata node.
|
||||||
|
* \param Replacement The replacement metadata node.
|
||||||
|
*/
|
||||||
|
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TempTargetMetadata,
|
||||||
|
LLVMMetadataRef Replacement);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new descriptor for the specified global variable that is temporary
|
* Create a new descriptor for the specified global variable that is temporary
|
||||||
|
|
|
@ -1152,6 +1152,23 @@ LLVMDIBuilderCreateGlobalVariableExpression(LLVMDIBuilderRef Builder,
|
||||||
unwrapDI<MDNode>(Decl), AlignInBits));
|
unwrapDI<MDNode>(Decl), AlignInBits));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data,
|
||||||
|
size_t Count) {
|
||||||
|
return wrap(
|
||||||
|
MDTuple::getTemporary(*unwrap(Ctx), {unwrap(Data), Count}).release());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode) {
|
||||||
|
MDNode::deleteTemporary(unwrapDI<MDNode>(TempNode));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TargetMetadata,
|
||||||
|
LLVMMetadataRef Replacement) {
|
||||||
|
auto *Node = unwrapDI<MDNode>(TargetMetadata);
|
||||||
|
Node->replaceAllUsesWith(unwrap<Metadata>(Replacement));
|
||||||
|
MDNode::deleteTemporary(Node);
|
||||||
|
}
|
||||||
|
|
||||||
LLVMMetadataRef
|
LLVMMetadataRef
|
||||||
LLVMDIBuilderCreateTempGlobalVariableFwdDecl(LLVMDIBuilderRef Builder,
|
LLVMDIBuilderCreateTempGlobalVariableFwdDecl(LLVMDIBuilderRef Builder,
|
||||||
LLVMMetadataRef Scope,
|
LLVMMetadataRef Scope,
|
||||||
|
|
|
@ -93,14 +93,23 @@ int llvm_test_dibuilder(void) {
|
||||||
LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy};
|
LLVMMetadataRef ParamTypes[] = {Int64Ty, Int64Ty, VectorTy};
|
||||||
LLVMMetadataRef FunctionTy =
|
LLVMMetadataRef FunctionTy =
|
||||||
LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0);
|
LLVMDIBuilderCreateSubroutineType(DIB, File, ParamTypes, 3, 0);
|
||||||
|
|
||||||
|
LLVMMetadataRef ReplaceableFunctionMetadata =
|
||||||
|
LLVMDIBuilderCreateReplaceableCompositeType(DIB, 0x15, "foo", 3,
|
||||||
|
File, File, 42,
|
||||||
|
0, 0, 0,
|
||||||
|
LLVMDIFlagFwdDecl,
|
||||||
|
"", 0);
|
||||||
|
|
||||||
|
LLVMMetadataRef FooParamLocation =
|
||||||
|
LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
|
||||||
|
ReplaceableFunctionMetadata, NULL);
|
||||||
LLVMMetadataRef FunctionMetadata =
|
LLVMMetadataRef FunctionMetadata =
|
||||||
LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
|
LLVMDIBuilderCreateFunction(DIB, File, "foo", 3, "foo", 3,
|
||||||
File, 42, FunctionTy, true, true,
|
File, 42, FunctionTy, true, true,
|
||||||
42, 0, false);
|
42, 0, false);
|
||||||
|
LLVMMetadataReplaceAllUsesWith(ReplaceableFunctionMetadata, FunctionMetadata);
|
||||||
|
|
||||||
LLVMMetadataRef FooParamLocation =
|
|
||||||
LLVMDIBuilderCreateDebugLocation(LLVMGetGlobalContext(), 42, 0,
|
|
||||||
FunctionMetadata, NULL);
|
|
||||||
LLVMMetadataRef FooParamExpression =
|
LLVMMetadataRef FooParamExpression =
|
||||||
LLVMDIBuilderCreateExpression(DIB, NULL, 0);
|
LLVMDIBuilderCreateExpression(DIB, NULL, 0);
|
||||||
LLVMMetadataRef FooParamVar1 =
|
LLVMMetadataRef FooParamVar1 =
|
||||||
|
|
Loading…
Reference in New Issue