[llvm-dev] GlobalVariable Recursive loop

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 28 09:50:36 PDT 2016


> On Sep 28, 2016, at 9:35 AM, Johan Wehrli via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> Hi,
> 
> I have implemented a recursive loop to go through all the user of a global variable but I have one issue left.
> 
> Depending the code, the global variable is using itself: 
> 
> @sSelectedAccount = internal constant %struct.KVObserver { %0* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.744 to %0*), i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*), i32 3 }, align 4
> 
> With the IR code above, I am stuck in an infinite loop:
> 
> 	1) The global sSelectedAccount has the following user: "i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*)"
> 	2) The bit cast has the following user: "%struct.KVObserver { %"type 0x7ff164027360"* bitcast (%struct.__NSConstantString_tag* @_unnamed_cfstring_.744 to %"type 0x7ff164027360"*), i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*), i32 3 }"
> 	3) The previous has the user sSelectedAccount -> so this create the infinite loop.
> 
> I was looking for a way to detect the loop and I think there is two possibilities:
> 	- from the global value, iterate through all the element and find the loop, but this need a lot of cast and another recursive loop (need to handle ConstantStruct, ConstantExpr, ConstantArray, etc.) Does anyone know if there is an easier way to do this?
> 	-during the recursive loop, can I find the “main” global value? e.g: when I am on "i8* bitcast (%struct.KVObserver* @sSelectedAccount to i8*)”, how can I get the global variable sSelectedAccount ?


What about keeping track of “visited” global in a side structure (hash map…) and skip these?

Note also that only GlobalValue can create cycles, so you’d need only to track these, not all constant.

— 
Mehdi

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160928/334bd631/attachment.html>


More information about the llvm-dev mailing list