----- Mensaje original ---- De: Benjamin Smedberg <benjamin at smedbergs.us> Para: LLVM Developers Mailing List <llvmdev at cs.uiuc.edu> Enviado: viernes, 22 de febrero, 2008 22:36:40 Asunto: Re: [LLVMdev] Calling functions -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Álvaro Castro wrote: | Hello! | | | I'm trying LLVM for generating code and I found something I cannot figure out or find in the documentation: | | I'm doing something like this to call "sin" from std: | | std::vector<const Type*> params; | params.push_back( Type::FloatTy ); | FunctionType *FT = FunctionType::get( Type::FloatTy, params, false); | Function *F = new Function( FT, Function::ExternalLinkage, "sin", M ); | CallInst *CallExternal = new CallInst( F, SomeValue, "external_call", BB ); | | | I can make some calls to functions like glclear() as I'm using opengl: | ... | Function *F = new Function( FT, Function::ExternalLinkage, "glclear", M ); | ... | | But if I want to call any function inside a C++ namespace I don't find the way to do it. Imagine you want to call | | othernamespace::globalFunction() See this older message: http://lists.cs.uiuc.edu/pipermail/llvmdev/2007-December/011616.html ************************* It seems that the previous message was sent with some corruption, sorry for it. It it happens again I'll use another e-mail. Thanks for your reply, Benjamin. I've tried that approach to the c++ function calls. I ended up with this code: ####### float test( float input ) { return 0.0; } [...] typedef float (*P_FUNCTION) ( float ); P_FUNCTION pt2Function = &test; intptr_t functionInt = (intptr_t)pt2Function; Constant *functionConstant = ConstantInt::get( APInt( sizeof(intptr_t), functionInt) ); const Type *ArgTy = Type::FloatTy; PointerType* arg = PointerType::get( ArgTy, 0 ); functionConstant = ConstantExpr::getIntToPtr( functionConstant, arg ); [...] (BB and CoefficientOne definition and other stuff) CallInst *CallExternal = new CallInst(functionConstant, CoefficientOne, "external_call", BB ); CallExternal->setTailCall(); ####### The runtime error was: /var/tmp/portage/sys-devel/llvm-base-2.2/work/llvm-2.2/include/llvm/Support/Casting.h:199: typename llvm::cast_retty<To, From>::ret_type llvm::cast(const Y&) [with X = llvm::FunctionType, Y = const llvm::Type*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed. I must admit I used AddressSpace = 0, but I have no idea of what to put there. I don't understand such a problem of types, as everything is a float except the integer holding the function address. I suppose the problem is elsewhere. Thanks a lot for your help. .alvaro.castro. ______________________________________________ ¿Con Mascota por primera vez? Sé un mejor Amigo. Entra en Yahoo! Respuestas http://es.answers.yahoo.com/info/welcome