llvm-c: Add LLVMDeleteInstruction to fix a test issue

Not deleting the loose instruction with metadata associated to it causes
an assertion when the LLVMContext is destroyed. This was previously
hidden by the fact that llvm-c-test does not call LLVMShutdown. The
planned removal of ManagedStatic exposed this issue.

Differential Revision: https://reviews.llvm.org/D129114
This commit is contained in:
Nicolai Hähnle 2022-07-04 14:41:03 +02:00
parent 0f4339a835
commit fdf7e437bf
4 changed files with 21 additions and 5 deletions

View File

@ -199,6 +199,9 @@ Changes to the C API
* ``LLVMConstURem``
* ``LLVMConstSRem``
* Add ``LLVMDeleteInstruction`` function which allows deleting instructions that
are not inserted into a basic block.
Changes to the Go bindings
--------------------------

View File

@ -3228,7 +3228,7 @@ LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
/**
* Remove and delete an instruction.
* Remove an instruction.
*
* The instruction specified is removed from its containing building
* block but is kept alive.
@ -3247,6 +3247,16 @@ void LLVMInstructionRemoveFromParent(LLVMValueRef Inst);
*/
void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
/**
* Delete an instruction.
*
* The instruction specified is deleted. It must have previously been
* removed from its containing building block.
*
* @see llvm::Value::deleteValue()
*/
void LLVMDeleteInstruction(LLVMValueRef Inst);
/**
* Obtain the code opcode for an individual instruction.
*

View File

@ -2803,6 +2803,10 @@ void LLVMInstructionEraseFromParent(LLVMValueRef Inst) {
unwrap<Instruction>(Inst)->eraseFromParent();
}
void LLVMDeleteInstruction(LLVMValueRef Inst) {
unwrap<Instruction>(Inst)->deleteValue();
}
LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst) {
if (ICmpInst *I = dyn_cast<ICmpInst>(unwrap(Inst)))
return (LLVMIntPredicate)I->getPredicate();

View File

@ -31,12 +31,11 @@ int llvm_set_metadata(void) {
LLVMValueRef values[] = { LLVMConstInt(LLVMInt32Type(), 0, 0) };
// This used to trigger an assertion
LLVMSetMetadata(
LLVMBuildRetVoid(b),
LLVMGetMDKindID("kind", 4),
LLVMMDNode(values, 1));
LLVMValueRef ret = LLVMBuildRetVoid(b);
LLVMSetMetadata(ret, LLVMGetMDKindID("kind", 4), LLVMMDNode(values, 1));
LLVMDisposeBuilder(b);
LLVMDeleteInstruction(ret);
return 0;
}