Beispiel #1
0
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);
}
Beispiel #2
0
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);
}