[LLVMdev] For a small help
Ferad Zyulkyarov
feradz at gmail.com
Wed Apr 4 12:53:21 PDT 2007
Reid, Jeff thanks for the quick response. This will help. I didn't
think of this way when sending the mail.. just blocked :)
Thanks again,
Ferad
On 4/4/07, Reid Spencer <rspencer at reidspencer.com> wrote:
> Hi Ferad,
>
> On Wed, 2007-04-04 at 19:48 +0200, Ferad Zyulkyarov wrote:
> > Hi,
> >
> > I want to ask for a small help for creating an instruction that calls
> > e member method of an object. I suppose that this is not a headache
> > but I am impatient in learning :) I would be very thankful if you can
> > show me an example snippet code that does this in LLVM. Below is
> > described my case.
> >
> > Let's say I have a class TestClass
> >
> > class TestClass
> > {
> > int testMethod(int a);
> > }
> >
> > and I want to create a call instruction that calls
> > obj.testMethod(input) where obj is an instance of TestClass
> >
> > TestClass obj; // I have this declared prior
> > int input = 1; // I have declared prior
> > int output; // I have this declared prior too
> > output = obj.testObject(input); // I want to create this instruction
> >
>
> Why not just code this up into a C++ function and submit it to the
> online demo to see what is produced? I submitted this:
>
> class TestClass {
> public:
> int testMethod(int a);
> virtual int testMethod2(int a);
> };
>
> int doit() {
> TestClass obj; // I have this declared prior
> int input = 1; // I have declared prior
> int output; // I have this declared prior too
> output = obj.testMethod(input); // I want to create this inst
> output += obj.testMethod2(input); // Try virtual too
> return output;
> }
>
> to http://llvm.org/demo/ and got:
>
> target datalayout = "e-p:32:32"
> target endian = little
> target pointersize = 32
> target triple = "i686-pc-linux-gnu"
> %struct.TestClass = type { int (...)** }
> %vtable for TestClass = external constant [3 x int (...)*] ; <[3 x int (...)*]*> [#uses=1]
>
> implementation ; Functions:
>
> int %doit()() {
> entry:
> %obj = alloca %struct.TestClass, align 16 ; <%struct.TestClass*> [#uses=3]
> %tmp = getelementptr %struct.TestClass* %obj, int 0, uint 0 ; <int (...)***> [#uses=1]
> store int (...)** getelementptr ([3 x int (...)*]* %vtable for TestClass, int 0, long 2), int (...)*** %tmp
> %tmp1 = call int %TestClass::testMethod(int)( %struct.TestClass* %obj, int 1 ) ; <int> [#uses=1]
> %tmp3 = call int %TestClass::testMethod2(int)( %struct.TestClass* %obj, int 1 ) ; <int> [#uses=1]
> %tmp5 = add int %tmp3, %tmp1 ; <int> [#uses=1]
> ret int %tmp5
> }
>
> declare int %TestClass::testMethod(int)(%struct.TestClass*, int)
>
> declare int %TestClass::testMethod2(int)(%struct.TestClass*, int)
>
> Note the "%vtable for TestClass" external constant array.
>
> Hope this helps,
>
> Reid.
>
>
>
> > Thanks,
> > Ferad
> >
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
--
Ferad Zyulkyarov
Barcelona Supercomputing Center
More information about the llvm-dev
mailing list