static ExternalCodeRefPtr makeExtCodeRefFromString(string callName, ExternalFunctionMap &f) { ExternalCodeRefPtr p; bool res; ExternalFunctionMap::CallingConvention conv; bool isNoReturn; int numParams; //lookup call name in function map string s = f.sym_sym(callName); LASSERT(s.size() != 0, "Failure with sym_sym for symbol "+callName); res = f.get_calling_convention(s, conv); LASSERT(res, "Could not find calling convention for "+s); res = f.get_noreturn(s, isNoReturn); LASSERT(res, "Could not find no return for "+s); res = f.get_num_stack_params(s, numParams); LASSERT(res, "Could not find number of stack params for "+s); LASSERT(numParams >= 0, "Invalid number of arguments for extcall:"+s+". Is it in your external call map file?"); //make an ExternalCodeRef ExternalCodeRef::ReturnType rty = ExternalCodeRef::Unknown; ExternalCodeRef::CallingConvention c; switch(conv) { case ExternalFunctionMap::CalleeCleanup: c = ExternalCodeRef::CalleeCleanup; break; case ExternalFunctionMap::CallerCleanup: c = ExternalCodeRef::CallerCleanup; break; case ExternalFunctionMap::FastCall: c = ExternalCodeRef::FastCall; break; case ExternalFunctionMap::X86_64_SysV: c = ExternalCodeRef::X86_64_SysV; break; case ExternalFunctionMap::X86_64_Win64: c = ExternalCodeRef::X86_64_Win64; default: assert(!"Invalid calling convention for external call!"); } if(isNoReturn) { rty = ExternalCodeRef::NoReturn; } std::string funcSign; bool sign = f.get_function_sign(s, funcSign); ExternalCodeRef *t = NULL; if(sign){ t = new ExternalCodeRef(s, numParams, c, rty, funcSign); } else { t = new ExternalCodeRef(s, numParams, c, rty); } return ExternalCodeRefPtr(t); }
static ExternalCodeRefPtr makeExtCodeRefFromString(string callName, ExternalFunctionMap &f) { ExternalCodeRefPtr p; bool res; ExternalFunctionMap::CallingConvention conv; bool isNoReturn; int numParams; //lookup call name in function map string s = f.sym_sym(callName); LASSERT(s.size() != 0, "Failure with sym_sym for symbol "+callName); res = f.get_calling_convention(s, conv); LASSERT(res, "Could not find calling convention for "+s); res = f.get_noreturn(s, isNoReturn); LASSERT(res, "Could not find no return for "+s); res = f.get_num_stack_params(s, numParams); LASSERT(res, "Could not find number of stack params for "+s); //make an ExternalCodeRef ExternalCodeRef::ReturnType rty = ExternalCodeRef::Unknown; ExternalCodeRef::CallingConvention c; switch(conv) { case ExternalFunctionMap::CalleeCleanup: c = ExternalCodeRef::CalleeCleanup; break; case ExternalFunctionMap::CallerCleanup: c = ExternalCodeRef::CallerCleanup; break; case ExternalFunctionMap::FastCall: c = ExternalCodeRef::FastCall; break; default: assert(!"Invalid calling convention for external call!"); } if(isNoReturn) { rty = ExternalCodeRef::NoReturn; } ExternalCodeRef *t = new ExternalCodeRef(s, numParams, c, rty); return ExternalCodeRefPtr(t); }