Hi Ferad,
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.