[LLVMdev] llvm-c: Types of functions
David Mirabito
david.mirabito at gmail.com
Sun May 5 16:11:03 PDT 2013
Hi All,
I'm beginning to learn & explore the LLVM API via the C bindings. Am running into
some troubles but at the moment cannot tell if this is just my misunderstanding/misuse
of the API, or a bug somewhere.
I have a bitcode file generated with 'clang --emit-llvm' and I know this is good because
I can run the 'test' function inside with lli, no problems.
However I run into issues when I try to get the argument types to the function. The basic
gist of my code is as follows. (Note I snipped the error checking, but everything is returning
OK):
My understanding is that I must get a handle (LLVMValueRef) to the function and from that
pull it's type as a LLVMTypeRef. This would be a 'function type', from which I can pull info about
the return type and iterate the arguments, etc. At least, that's what I'm trying to do in my code:
LLVMContextRef context = LLVMContextCreate();
LLVMMemoryBufferRef fileMemBuff;
LLVMCreateMemoryBufferWithContentsOfFile(
"test.bin", &fileMemBuff, &msg);
LLVMModuleRef module;
LLVMGetBitcodeModuleInContext(
context, fileMemBuff, &module, &msg);
LLVMValueRef testFunc = LLVMGetNamedFunction(module, "test");
assert(testFunc);
if (LLVMIsAFunction(testFunc)) printf("Is a Function\n"); // <-- I do see this message, so far so good
else printf("Not a Func\n");
LLVMTypeRef testType;
testType = LLVMTypeOf(testFunc);
printf("Type is: %d\n", LLVMGetTypeKind(testType));
printf("For reference: Function: %d Pointer: %d\n",
LLVMFunctionTypeKind, LLVMPointerTypeKind);
if( LLVMIsFunctionVarArg(testType)) printf("is vaarg\n");
else printf("no vararg\n");
And at runtime I see that the LLVMTypeOf is corresponds to LLVMPointerTypeKind.
./app
Is a Function
Type is: 12
For reference: Function: 9 Pointer: 12
Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast, file /Users/davidm/code/contrib/llvm/llvm/include/llvm/Support/Casting.h, line 237.
Shouldn't this be a function type?
I also can't seem to find how to learn what type it points to - LLVMPointerType() appears to create a
new pointer-to-X but is there no getter to find what X is for this pointer in hand?
Am on SVN tip on macos.
LLVMDumpModule(module) says:
; ModuleID = 'test.bin'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.8.0"
@foo = global i32 0, align 4
; Materializable
; Function Attrs: nounwind ssp uwtable
declare void @test() #0
attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
And LLVMDumpValue(testFunc):
; Materializable
; Function Attrs: nounwind ssp uwtable
declare void @test() #0
I've tried with various signatures for the test function to no effect, at the moment it just happens to be void test(void);.
What am I doing or thinking wrong? It's possible I'm missing some init calls
Thanks,
DavidM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130506/b5ac4aed/attachment.html>
More information about the llvm-dev
mailing list