Vassil Vassilev
2014-Feb-10 21:04 UTC
[LLVMdev] Remove a GlobalValue and its orphaned references
Hi, I need to implement a llvm IR transformation pass, which removes a GlobalFunction/GlobalVariable and removes all the dead values, which were the *referenced* by the GlobalValue being removed. I.e all the orphaned values that were left after the death of the global value. Eg. ... @.str = private unnamed_addr constant [2 x i8] c"a\00", align 1 @.str1 = private unnamed_addr constant [2 x i8] c"b\00", align 1 @.str2 = private unnamed_addr constant [2 x i8] c"c\00", align 1 @options = constant [3 x %struct.OptionDef] [%struct.OptionDef { i8* getelementptr inbounds ([2 x i8]* @.str, i32 0, i32 0), i32 0, %union.anon { i32 3 } }, %struct.OptionDef { i8* getelementptr inbounds ([2 x i8]* @.str1, i32 0, i32 0), i32 0, %union.anon { i32 4 } }, %struct.OptionDef zeroinitializer], align 16 (I need to remove options and ".str" and ".str1", but not ".str2" since it wasn't referenced by "options", it should work also with functions). I think what I want to do is already very close to the GlobalDCEPass, only if I could give it a 'starting point'. I realize this is a little bit weird use case, but I was wondering is there a pass in llvm that could do it? Many thanks, Vassil