[LLVMdev] Function pointers bitcasted to varargs

Arushi Aggarwal arushi987 at gmail.com
Wed Apr 21 19:51:46 PDT 2010


Thanks!.

Arushi

On Wed, Apr 21, 2010 at 4:34 PM, Eugene Toder <eltoder at gmail.com> wrote:
> Do you compile this as C? In C, unlike in C++, empty parenthesis do
> not mean "no arguments", they mean "no prototype", which is typically
> treated the same way as varargs in calling conventions. To declare
> function with no arguments do typedef void (*FP)(void);
>
> Eugene
>
> On Wed, Apr 21, 2010 at 10:22 PM, Arushi Aggarwal <arushi987 at gmail.com> wrote:
>> Hi all,
>>
>> I had the following function that used function pointers with void arguments,
>>
>>
>> typedef void (*FP)();
>>
>> void foo() {
>>  printf("hello world from foo\n");
>> }
>> int main() {
>>  FP fp;
>>  fp = foo;
>>  (*fp)();
>>
>> }
>>
>> The corresponding bitcode, with no optimizations is
>>
>> target datalayout =
>> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
>> target triple = "x86_64-unknown-linux-gnu"
>>
>> @.str = private constant [21 x i8] c"hello world from foo\00", align 1
>> ; <[21 x i8]*> [#uses=1]
>>
>> define void @foo() nounwind {
>> entry:
>>  %0 = call i32 @puts(i8* getelementptr inbounds ([21 x i8]* @.str,
>> i64 0, i64 0)) nounwind ; <i32> [#uses=0]
>>  br label %return
>>
>> return:                                           ; preds = %entry
>>  ret void
>> }
>>
>> declare i32 @puts(i8*)
>>
>> define i32 @main() nounwind {
>> entry:
>>  %retval = alloca i32                            ; <i32*> [#uses=1]
>>  %fp = alloca void (...)*                        ; <void (...)**> [#uses=2]
>>  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
>>  store void (...)* bitcast (void ()* @foo to void (...)*), void
>> (...)** %fp, align 8
>>  %0 = load void (...)** %fp, align 8             ; <void (...)*> [#uses=1]
>>  call void (...)* %0() nounwind
>>  br label %return
>>
>> return:                                           ; preds = %entry
>>  %retval1 = load i32* %retval                    ; <i32> [#uses=1]
>>  ret i32 %retval1
>> }
>>
>> I was wondering why LLVM casts the function pointer to a varargs
>> function?Is there some reason why it should do that?
>>
>> Thanks.
>> Arushi
>> _______________________________________________
>> 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