[LLVMdev] Global variable-length array

Talin viridia at gmail.com
Sat Apr 19 21:47:25 PDT 2008


All right, that solves my problem. Thanks :)

Gordon Henriksen wrote:
> On Apr 19, 2008, at 22:45, Talin wrote:
>
>> Suppose I have a global variable which points to a constant, variable 
>> length array.
>
> This is somewhat contradictory. Do you want an 'vla *g;' in C? If so, 
> your global will be of type %vla** (you'll load a pointer to the array 
> from the global). Its initializer would be a bitcast of a global which 
> has some type similar to %vla. If not, and you indeed want a global of 
> type %vla*, read on…
>
>> The question is, how can I assign an array of type "{ i32, [5 x 
>> float]}" to a global of type "{ i32, [0 x float]}"?
>
> You can't, but declarations and definitions can have differing types. 
> For instance:
>
> $ cat a.ll
> @g = external global {i32, [0 x float]}
>
> define {i32, [0 x float]}* @f() {
> entry:
>     ret {i32, [0 x float]}* @g
> }
> $ cat b.ll
> @g = constant {i32, [5 x float]} zeroinitializer
>
> If this is for separate compilation, the linker will automatically 
> resolve the type conflict. It does so by replacing all uses of the 
> declaration with bitcasts of the definition. Using the same example:
>
> $ llvm-as a.ll; llvm-as b.ll; llvm-link a.bc b.bc | llvm-dis
> ; ModuleID = '<stdin>'
> @g = constant { i32, [5 x float] } zeroinitializer        ; <{ i32, [5 
> x float] }*> [#uses=1]
>
> define { i32, [0 x float] }* @f() {
> entry:
>     ret { i32, [0 x float] }* bitcast ({ i32, [5 x float] }* @g to { 
> i32, [0 x float] }*)
> }
>
> Internally to your front end, you could do the same thing: Declare the 
> global early with its abstract type, and later when the concrete 
> storage type is known, use ConstantExpr::getBitCast, 
> replaceAllUsesWith, and takeName to do the same thing the linker did 
> above.
>
> — Gordon
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>   




More information about the llvm-dev mailing list