Use still stuck around after Def is destroyed:

I made a GlobalVariable that is of type ConstantArray. For one of it's
elements I assigned it the ConstantExpr::getBitCast of another
GlobalVariable(the "shadow pointer" mentioned). This gives me:

        While deleting: i32 (i32)** %Shadow Variable for ptr1
        Use still stuck around after Def is destroyed:i8* bitcast (i32
(i32)** @"Shadow Variable for ptr1" to i8*)
        opt: Value.cpp:75: virtual llvm::Value::~Value(): Assertion
`use_empty() && "Uses remain when a value is destroyed!"' failed.

I only see this after my Pass' runOnModule() method is done. I'm not
sure what I'm doing wrong, this seems like a legitimate actions. I
also cant come up with another way to do this.

Any advice?
Thank you

I made a GlobalVariable that is of type ConstantArray. For one of it’s
elements I assigned it the ConstantExpr::getBitCast of another
GlobalVariable(the “shadow pointer” mentioned). This gives me:

While deleting: i32 (i32)** %Shadow Variable for ptr1
Use still stuck around after Def is destroyed:i8* bitcast (i32
(i32)** @“Shadow Variable for ptr1” to i8*)
opt: Value.cpp:75: virtual llvm::Value::~Value(): Assertion
`use_empty() && “Uses remain when a value is destroyed!”’ failed.

I only see this after my Pass’ runOnModule() method is done. I’m not
sure what I’m doing wrong, this seems like a legitimate actions. I
also cant come up with another way to do this.

Are you saying that a dead ConstantExpr that uses the Global is hanging around when you try to delete it?

If so, use removeDeadUsersOfConstant() on the Global before you try to remove it.

If the use is not dead, then you can’t remove the GlobalVar.

-Tanya

I made a GlobalVariable that is of type ConstantArray. For one of it’s
elements I assigned it the ConstantExpr::getBitCast of another
GlobalVariable(the “shadow pointer” mentioned). This gives me:

While deleting: i32 (i32)** %Shadow Variable for ptr1
Use still stuck around after Def is destroyed:i8* bitcast (i32
(i32)** @“Shadow Variable for ptr1” to i8*)
opt: Value.cpp:75: virtual llvm::Value::~Value(): Assertion
`use_empty() && “Uses remain when a value is destroyed!”’ failed.

I only see this after my Pass’ runOnModule() method is done. I’m not
sure what I’m doing wrong, this seems like a legitimate actions. I
also cant come up with another way to do this.

Are you saying that a dead ConstantExpr that uses the Global is hanging around when you try to delete it?

If so, use removeDeadUsersOfConstant() on the Global before you try to remove it.

Sorry, I mean

removeDeadConstantUsers ( )

-Tanya

No, I am not trying to delete anything.

I wanted to created a GlobalVariable that is of Type ConstantArray,
where one of the elements its a BitCast of a GlobalVariable. I have
that, but I get those errors after my pass is done. I dont know why,
my code seems sane enough, and I dont know another way I can go about
this.

Hi ret val,

No, I am not trying to delete anything.

perhaps this happens when the module is being deleted. If so, it might
mean that you forgot to add the global variable to the module. Otherwise,
I suggest you fire up a debugger and rummage around.

Ciao, Duncan.