aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/CppBackend/CPPBackend.cpp2
-rw-r--r--lib/Target/CppBackend/CallHandlers.h25
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);
}