[LLVMdev] 'Address of Label and Indirect Branches in LLVM IR' blog post
Török Edwin
edwintorok at gmail.com
Sun Jan 3 01:17:51 PST 2010
On 2010-01-03 10:33, Chris Lattner wrote:
> If you're interested in this new extension, here is some more information with some less-than-obvious aspects of the design:
> http://blog.llvm.org/2010/01/address-of-label-and-indirect-branches.html
>
> This feature was added to LLVM by Bob Wilson, Dan Gohman and I to mainline back in November. If you have questions or comments about the post, this is a good thread to discuss them on :)
>
Can a label be listed multiple times in indirectbr?
Clang generates this:
foo: ; preds =
%indirectgoto, %indirectgoto, %indirectgoto, %indirectgoto, %indirectgoto
store i32 1, i32* %retval
br label %return
indirectbr i8* %indirect.goto.dest, [label %foo, label %foo, label %bar,
label %foo, label %hack, label %foo, label %foo]
For this code taken from the gcc manual:
....
static const int array[] = { &&foo - &&foo, &&bar - &&foo,
&&hack - &&foo };
goto *(&&foo + array[i]);
.....
If I remove &&foo - &&foo from the array, clang still thinks that &&foo
is a possible destination, even if I run some optimizers on it.
Since the argument to goto is an array of constants, it should be
possible for an optimizer to determine the exact list of destinations.
Also the intent of that code is to allow it to go into a readonly
section, however with Clang it only goes to a .data.rel.ro section (with
-fPIC):
.section .data.rel.ro,"aw", at progbits
.align 4
foo.array:
.long (.LBA3_foo_return) - (.LBA3_foo_return)
.long (.LBA3_foo_bar) - (.LBA3_foo_return)
.long (.LBA3_foo_hack) - (.LBA3_foo_return)
.size foo.array, 12
While gcc does put it into a readonly section (with -fPIC):
.section .rodata
.align 4
.type array.1248, @object
.size array.1248, 12
array.1248:
.long 0
.long .L4-.L2
.long .L5-.L2
Best regards,
--Edwin
More information about the llvm-dev
mailing list