[LLVMdev] For a small help

Reid Spencer rspencer at reidspencer.com
Wed Apr 4 11:36:38 PDT 2007


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
> 




More information about the llvm-dev mailing list