diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-01-10 18:14:00 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-01-10 18:14:00 -0800 |
commit | 8b14164f0d63eb2cc0348ed4a57c86dad897ff4f (patch) | |
tree | e9179e63461898f56b0094e4e5a685d0382db268 /lib/Target/JSBackend/JSBackend.cpp | |
parent | ec23adbe311396b12ff8c8c488b087012a8f73d5 (diff) |
allow function signatures to be customized by the function name
Diffstat (limited to 'lib/Target/JSBackend/JSBackend.cpp')
-rw-r--r-- | lib/Target/JSBackend/JSBackend.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
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 |