aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2014-01-10 18:14:00 -0800
committerAlon Zakai <alonzakai@gmail.com>2014-01-10 18:14:00 -0800
commit8b14164f0d63eb2cc0348ed4a57c86dad897ff4f (patch)
treee9179e63461898f56b0094e4e5a685d0382db268 /lib
parentec23adbe311396b12ff8c8c488b087012a8f73d5 (diff)
allow function signatures to be customized by the function name
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/JSBackend/CallHandlers.h8
-rw-r--r--lib/Target/JSBackend/JSBackend.cpp12
2 files changed, 16 insertions, 4 deletions
diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h
index 81cc2d8469..73a3fc35b9 100644
--- a/lib/Target/JSBackend/CallHandlers.h
+++ b/lib/Target/JSBackend/CallHandlers.h
@@ -1,6 +1,7 @@
// Call handlers: flexible map of call targets to arbitrary handling code
//
// Each handler needs DEF_CALL_HANDLER and SETUP_CALL_HANDLER
+//
typedef std::string (JSWriter::*CallHandler)(const Instruction*, std::string Name, int NumArgs);
typedef std::map<std::string, CallHandler> CallHandlerMap;
@@ -58,13 +59,13 @@ DEF_CALL_HANDLER(__default__, {
FT = dyn_cast<FunctionType>(dyn_cast<PointerType>(CV->getType())->getElementType());
ensureFunctionTable(FT);
if (!Invoke) {
- Sig = getFunctionSignature(FT);
+ Sig = getFunctionSignature(FT, &Name);
Name = std::string("FUNCTION_TABLE_") + Sig + "[" + Name + " & #FM_" + Sig + "#]";
NeedCasts = false; // function table call, so stays in asm module
}
}
if (Invoke) {
- Sig = getFunctionSignature(FT);
+ Sig = getFunctionSignature(FT, &Name);
Name = "invoke_" + Sig;
NeedCasts = true;
}
@@ -183,16 +184,19 @@ DEF_CALL_HANDLER(llvm_nacl_atomic_store_i32, {
DEF_CALL_HANDLER(llvm_memcpy_p0i8_p0i8_i32, {
Declares.insert("memcpy");
+ Redirects["llvm_memcpy_p0i8_p0i8_i32"] = "memcpy";
return CH___default__(CI, "_memcpy", 3) + "|0";
})
DEF_CALL_HANDLER(llvm_memset_p0i8_i32, {
Declares.insert("memset");
+ Redirects["llvm_memset_p0i8_i32"] = "memset";
return CH___default__(CI, "_memset", 3) + "|0";
})
DEF_CALL_HANDLER(llvm_memmove_p0i8_p0i8_i32, {
Declares.insert("memmove");
+ Redirects["llvm_memmove_p0i8_p0i8_i32"] = "memmove";
return CH___default__(CI, "_memmove", 3) + "|0";
})
diff --git a/lib/Target/JSBackend/JSBackend.cpp b/lib/Target/JSBackend/JSBackend.cpp
index 08aa6a1acf..b583472aa9 100644
--- a/lib/Target/JSBackend/JSBackend.cpp
+++ b/lib/Target/JSBackend/JSBackend.cpp
@@ -185,7 +185,15 @@ namespace {
else if (T->isFloatTy() || T->isDoubleTy()) return 'd'; // TODO: float
else return 'i';
}
- std::string getFunctionSignature(const FunctionType *F) {
+ std::string getFunctionSignature(const FunctionType *F, std::string *Name=NULL) {
+ if (Name) {
+ // special-case some function signatures, because of how we emit code for them FIXME this is hackish
+ if (*Name == "_llvm_memcpy_p0i8_p0i8_i32" || *Name == "_memcpy" ||
+ *Name == "_llvm_memset_p0i8_i32" || *Name == "_memset" ||
+ *Name == "_llvm_memmove_p0i8_p0i8_i32" || *Name == "_memmove") {
+ return "iiii";
+ }
+ }
std::string Ret;
Ret += getFunctionSignatureLetter(F->getReturnType());
for (FunctionType::param_iterator AI = F->param_begin(),
@@ -197,7 +205,7 @@ namespace {
unsigned getFunctionIndex(const Function *F) {
std::string Name = getJSName(F);
if (IndexedFunctions.find(Name) != IndexedFunctions.end()) return IndexedFunctions[Name];
- std::string Sig = getFunctionSignature(F->getFunctionType());
+ std::string Sig = getFunctionSignature(F->getFunctionType(), &Name);
FunctionTable &Table = FunctionTables[Sig];
// use alignment info to avoid unnecessary holes. This is not optimal though,
// (1) depends on order of appearance, and (2) really just need align for &class::method, see test_polymorph