diff options
-rw-r--r-- | lib/Target/CppBackend/CPPBackend.cpp | 2 | ||||
-rw-r--r-- | lib/Target/CppBackend/CallHandlers.h | 25 |
2 files changed, 16 insertions, 11 deletions
diff --git a/lib/Target/CppBackend/CPPBackend.cpp b/lib/Target/CppBackend/CPPBackend.cpp index f847ba1469..a1102a7188 100644 --- a/lib/Target/CppBackend/CPPBackend.cpp +++ b/lib/Target/CppBackend/CPPBackend.cpp @@ -1705,7 +1705,7 @@ std::string CppWriter::generateInstruction(const Instruction *I) { } case Instruction::Call: { const CallInst *CI = cast<CallInst>(I); - text = handleCall(CI); + text = handleCall(CI) + ';'; break; } case Instruction::Select: { diff --git a/lib/Target/CppBackend/CallHandlers.h b/lib/Target/CppBackend/CallHandlers.h index 75020d45a4..59cc051301 100644 --- a/lib/Target/CppBackend/CallHandlers.h +++ b/lib/Target/CppBackend/CallHandlers.h @@ -2,34 +2,36 @@ // // Each handler needs DEF_CALL_HANDLER and SETUP_CALL_HANDLER -typedef std::string (CppWriter::*CallHandler)(const CallInst*); +typedef std::string (CppWriter::*CallHandler)(const CallInst*, std::string Name, unsigned NumArgs); typedef std::map<std::string, CallHandler> CallHandlerMap; CallHandlerMap *CallHandlers; // Definitions #define DEF_CALL_HANDLER(Ident, Code) \ - std::string CH_##Ident(const CallInst *CI) { Code } + std::string CH_##Ident(const CallInst *CI, std::string Name, unsigned NumArgs) { Code } DEF_CALL_HANDLER(__default__, { - const int numArgs = CI->getNumArgOperands(); Type *RT = CI->getCalledFunction()->getReturnType(); - std::string text = getCppName(CI->getCalledValue()) + "("; - for (int i = 0; i < numArgs; i++) { + std::string text = Name + "("; + for (unsigned i = 0; i < NumArgs; i++) { text += getValueAsCastStr(CI->getArgOperand(i)); // FIXME: differentiate ffi calls - if (i < numArgs - 1) text += ", "; + if (i < NumArgs - 1) text += ", "; } text += ")"; if (!RT->isVoidTy()) { text = getAssign(getCppName(CI), RT) + getCast(text, RT); } - return text + ';'; + return text; }) DEF_CALL_HANDLER(llvm_nacl_atomic_store_i32, { - return "HEAP32[" + getValueAsStr(CI->getArgOperand(0)) + ">>2]=" + getValueAsStr(CI->getArgOperand(1)) + ";"; + return "HEAP32[" + getValueAsStr(CI->getArgOperand(0)) + ">>2]=" + getValueAsStr(CI->getArgOperand(1)); }) +DEF_CALL_HANDLER(llvm_memcpy_p0i8_p0i8_i32, { + return CH___default__(CI, "_memcpy", 3) + "|0"; +}) // Setups @@ -40,11 +42,14 @@ void setupCallHandlers() { SETUP_CALL_HANDLER(__default__); SETUP_CALL_HANDLER(llvm_nacl_atomic_store_i32); + SETUP_CALL_HANDLER(llvm_memcpy_p0i8_p0i8_i32); } std::string handleCall(const CallInst *CI) { - CallHandlerMap::iterator CH = CallHandlers->find(getCppName(CI->getCalledValue())); + std::string Name = getCppName(CI->getCalledValue()); + unsigned NumArgs = CI->getNumArgOperands(); + CallHandlerMap::iterator CH = CallHandlers->find(Name); if (CH == CallHandlers->end()) CH = CallHandlers->find("___default__"); - return (this->*(CH->second))(CI); + return (this->*(CH->second))(CI, Name, NumArgs); } |