[LLVMdev] Function pointers

Anders Alexandersson anders.alexandersson at student.htu.se
Fri Apr 2 06:03:01 PST 2004


OK, I solved it all ( so far :) ), mixing in some load-instructions and called on the result of that, which worked.

Here is the skeleton-code:

%kernel = type {  int ()*  }

int puts_kernel(){...}

; main()

%theKernel = malloc %kernel
%puts_kernelPTR = getelementptr %kernel* %theKernel, long 1, ubyte 0

store int ()* %puts_kernel, int ()** %puts_kernelPTR
%tmp.11 = load int ()** %puts_kernelPTR                      

%tmp.2 = call int %tmp.11() 

free %kernel* %theKernel

:-)

Anders

-----Original Message-----
From: Anders Alexandersson <anders.alexandersson at student.htu.se>
To: llvmdev at cs.uiuc.edu
Date: Fri, 02 Apr 2004 13:38:30 +0200
Subject: Re: Re: Re: [LLVMdev] Function pointers

I solved that one by substituting alloca into malloc, and forwarded the problem to actually calling the %puts_kernel function via my newly created function pointer.

This works:
 %tmp.1 = call int %puts_kernel()

This:
 %tmp.2 = call int %puts_kernelPTR()

issues error:
"Reference to an invalid definition: 'puts_kernelPTR' of type 'int () *'" 

How do I call the function using the function pointer?

Anders

-----Original Message-----
From: Anders Alexandersson <anders.alexandersson at student.htu.se>
To: llvmdev at cs.uiuc.edu
Date: Fri, 02 Apr 2004 10:07:50 +0200
Subject: Re: Re: [LLVMdev] Function pointers

So, here comes the next question:)

Now the program compiles, but crashes when run, "Segmentation fault".


%kernel = type {  int ()*  }

int %puts_kernel()
{
   ret int 0
}


int %main() {

   %theKernel = alloca %kernel

   %puts_kernelPTR = getelementptr %kernel* %theKernel, long 1, ubyte 0
   store int ()* %puts_kernel, int ()** %puts_kernelPTR

   ret int 0
}

I want to learn how to achieve the mechanisms in this C code:

#include <stdio.h>

int DoIt(void);
int DoIt(void){
 return 0; 
}

int main()
{
        int (*pt2Function) ();     

        int a = DoIt();
        printf("a is: %i\n", a);

        pt2Function = DoIt;

        int b = pt2Function();
        printf("b is: %i\n", b);
}

Grateful for hints!

Anders



-----Original Message-----
From: Chris Lattner <sabre at nondot.org>
To: llvmdev at cs.uiuc.edu
Date: Thu, 1 Apr 2004 09:51:48 -0600 (CST)
Subject: Re: [LLVMdev] Function pointers

On Thu, 1 Apr 2004 anders.alexandersson at student.htu.se wrote:

> Yes! :-)
> What would I do without you folks?!

:)

> I am the one trying to build a Ruby compiler prototype, so be prepared for
> more questions...:)

Sounds great!

-Chris

> ----- Original Message -----
> From: "Chris Lattner" <sabre at nondot.org>
> To: <llvmdev at cs.uiuc.edu>
> Sent: Wednesday, March 31, 2004 5:49 PM
> Subject: Re: [LLVMdev] Function pointers
>
>
> On Wed, 31 Mar 2004, Anders Alexandersson wrote:
>
> > Hello out there!
> >
> > I am trying to build a table of 2 function poiters by using an array:
> >
> > %kernel = alloca [ 2 x int ()* ]
> >
> > I try to access the first pointer to be able to store location of my first
> function like this:
> >
> > %function_pointer_1 = getelementptr [2 x int ()* ]* %kernel, long 0, long
> 0
> >
> > store int ()* %function_1, int ()* %function_pointer_1
>
> You just need an extra * here:      ^
>
> You're storing a pointer through a pointer to pointers... :)
>
> -Chris
>
> >
> > But, I get the error message from llvm-asm:
> > llvm-as: 1.ll:40: Can't store 'int () *' into space of type 'int ()'!
> >
> > What is my mistake?
> >
> > Grateful for hints
> > Anders
> >
> > ----------------------------------------------------------------
> > Anders Alexandersson
> > Masters student at the special year of Software Engineering, HTU
> Trollh4an
> > E-mail: anders.alexandersson at student.htu.se
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
> >
>
> -Chris
>
>

-Chris

-- 
http://llvm.cs.uiuc.edu/
http://www.nondot.org/~sabre/Projects/


_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev



----------------------------------------------------------------
Anders Alexandersson
Masters student at the special year of Software Engineering, HTU Trollhättan
E-mail: anders.alexandersson at student.htu.se

_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev



----------------------------------------------------------------
Anders Alexandersson
Masters student at the special year of Software Engineering, HTU Trollhättan
E-mail: anders.alexandersson at student.htu.se

_______________________________________________
LLVM Developers mailing list
LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev



----------------------------------------------------------------
Anders Alexandersson
Masters student at the special year of Software Engineering, HTU Trollhättan
E-mail: anders.alexandersson at student.htu.se




More information about the llvm-dev mailing list