[LLVMdev] Indirect Branch Representation

kapil anand kapilanand2 at gmail.com
Thu Jul 24 07:54:02 PDT 2008


So, that means that &&(Label) operator, which is defined in C++, is also not
supported currently in LLVM. I thought I could obtain address of basic block
indirectly through this small hack but it does not seem to work.

Actually, I tried to make folloing dummy C++ code which uses this operator:

*int main(int argc,char** argv)
{
        int x;
        int y;
L1:     printf("Hello\n");
L2:     printf("World\n");*
*        if(atoi(argv[1]) == 1)
                x = &&L1;
        else*
*                x = &&L2;*
*        y = x + 10;
        return y;
}*
*

* *( The above code is not correct as we cast from pointer to interger and
also not an example of good programming but would anyways compile correctly
in GCC)*

If I use llvmgcc, I get:

@.str = internal constant [6 x i8] c"Hello\00"
@.str1 = internal constant [6 x i8] c"World\00"

*define i32 @main(i32 %argc, i8** %argv) nounwind  {

entry:  %"alloca point" = bitcast i32 0 to i32
        br label %L1*
*L1:             ; preds = %indirectgoto, %indirectgoto, %entry
        %tmp1 = call i32 @puts( i8* getelementptr ([6 x i8]* @.str, i32 0,
i32
        br label %L2*
*L2:             ; preds = %indirectgoto, %L1
        %tmp2 = call i32 @puts( i8* getelementptr ([6 x i8]* @.str1, i32 0,
i32
        %tmp4 = getelementptr i8** %argv, i32 1
        %tmp5 = load i8** %tmp4, align 4
        %tmp6 = call i32 @atoi( i8* %tmp5 ) nounwind
        %tmp7 = icmp eq i32 %tmp6, 1
        %tmp78 = zext i1 %tmp7 to i8
        %toBool = icmp ne i8 %tmp78, 0
        br i1 %toBool, label %bb, label %bb9

bb:             ; preds = %L2
        ptrtoint i8* inttoptr (i32 1 to i8*) to i32
        br label %bb10*
*bb9:            ; preds = %L2
        ptrtoint i8* inttoptr (i32 2 to i8*) to i32
        br label %bb10

bb10:           ; preds = %bb9, %bb
        %x.0 = phi i32 [ 2, %bb9 ], [ 1, %bb ]
        %tmp12 = add i32 %x.0, 10
        br label %return

return:
         ret i32 %tmp12*
**
*indirectgoto:           ; No predecessors!
        switch i32 undef, label %L1 [
                 i32 1, label %L1
                 i32 2, label %L2
        ]
}*
*declare i32 @puts(i8*)*
*declare i32 @atoi(i8*)
*
**
The instruction marked in BOLD should correspond to each other but LLVM code
does not seem to capture the logic represented in corresponding C Code. So,
should we take care to avoid such kind of label operators in code.

Kapil



On Thu, Jul 24, 2008 at 2:47 AM, Chris Lattner <clattner at apple.com> wrote:

>
> On Jul 23, 2008, at 8:47 PM, kapil anand wrote:
>
> >
> > Specifically, I need a way to represent indirect branch instruction
> > (in binary) as an equivalent LLVM instruction. With switch
> > instruction , I would have to list all the possible targets and then
> > initialize the corresponding instruction. I was just thinking
> > whether it might be possible to have some kind of indirect branch
> > where label is a "variable" and not an explicit label present in
> > module.
> >
> No, and there never will be a way.  In the future, we will probably
> extend the CFG to better model the GCC "address of label + indirect
> goto" extension.  However, even with that, all the possible
> destinations of an indirect goto must be explicitly known.
>
> Without knowing the CFG, the compiler cannot do any useful
> optimization.  Eli is right, you probably want lots of tail calls or
> something.
>
> -Chris
>  _______________________________________________
> 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/20080724/828a6ae4/attachment.html>


More information about the llvm-dev mailing list