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 ? Greetings, Johan -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160928/71c6d395/attachment.html>
> 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>
Hi Mehdi,> 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.Thanks for the proposition, I will try that. Greetings, Johan> On 28 Sep 2016, at 18:50, Mehdi Amini <mehdi.amini at apple.com> wrote: > >> >> On Sep 28, 2016, at 9:35 AM, Johan Wehrli via llvm-dev <llvm-dev at lists.llvm.org <mailto: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/20160929/1667aa25/attachment.html>