[LLVMdev] Function pointers

Anders Alexandersson anders.alexandersson at student.htu.se
Fri Apr 2 02:07:02 PST 2004


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




More information about the llvm-dev mailing list