[LLVMdev] differences in IR and ELF?
ret val
retval386 at gmail.com
Thu Nov 24 15:46:46 PST 2011
Contents of section my_section:
400890 c3666666 6666662e 0f1f8400 00000000 .ffffff.........
4008a0 38106000 00000000 b0064000 00000000 8.`....... at .....
4008b0 d0064000 00000000 0f1f8400 00000000 .. at .............
4008c0 38106000 00000000 d0064000 00000000 8.`....... at .....
4008d0 30074000 00000000 0. at .....
This seems too big and doesn't make sense considering the IR.
On Thu, Nov 24, 2011 at 3:44 AM, James Molloy <james.molloy at arm.com> wrote:
> Hi,
>
> How large is the section? How large should it be? Can you post an objdump
-r
> of it?
>
> Cheers,
>
> James
>
> -----Original Message-----
> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On
> Behalf Of ret val
> Sent: 24 November 2011 02:20
> To: llvmdev at cs.uiuc.edu
> Subject: [LLVMdev] differences in IR and ELF?
>
> I'm trying to create a GlobalVariable that is a ConstantArray. Id like
> each element to be a pointer to other things in the program(global
> variables, functions). So that they all have the same type Id like to
> make the elements void pointers.
>
> I think I am going about this wrong, heres how I am doing it:
>
> void writeArray(Module &M, GlobalVariable *shadow, Function *val,
> Function *func) {
> /* Build up contents */
> vector<Constant *> v_elements;
> Type *elm_type = Type::getInt32PtrTy(M.getContext());
>
> Constant *tmp = dyn_cast<Constant>(shadow);
> assert(tmp != NULL && "shadow");
> v_elements.push_back(ConstantExpr::getBitCast(tmp,
> elm_type));
>
> tmp = dyn_cast<Constant>(val);
> assert(tmp != NULL && "value");
> v_elements.push_back(ConstantExpr::getBitCast(tmp,
> elm_type));
>
> tmp = dyn_cast<Constant>(func);
> assert(tmp != NULL && "function");
> v_elements.push_back(ConstantExpr::getBitCast(tmp,
> elm_type));
>
> /* Create array */
> ArrayRef<Constant *> a_elements(v_elements);
> ArrayType *type = ArrayType::get(elm_type, 3);
> Constant *array = ConstantArray::get(type, a_elements);
>
> /* Make new GlobalVariable from array */
> GlobalVariable *global = new GlobalVariable(M, type, true,
>
> my_linkage, array,
>
> "my array");
> global->setSection(*my_section);
> }
>
> The IR looks like this:
> @"my array" = constant [3 x i32*] [i32* bitcast (i32 (i32)** @"Shadow
> Variable for ptr1" to i32*), i32* bitcast (i32 (i32)* @f2 to i32*),
> i32* bitcast (i32 (i32)* @f1 to i32*)], section "my_section"
> @"my array2" = constant [3 x i32*] [i32* bitcast (i32 (i32)** @"Shadow
> Variable for ptr1" to i32*), i32* bitcast (i32 (i32)* @f1 to i32*),
> i32* bitcast (i32 ()* @main to i32*)], section "my_section"
>
> The ELF section is too large. It does not look like padding, it looks
> like more are being created and I don't know why.
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20111124/3b006eb3/attachment.html>
More information about the llvm-dev
mailing list