[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