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>