aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-15 16:54:28 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-15 18:26:40 -0700
commit52712de67e16d36dd9c1325850c05fd14b00c621 (patch)
treed0da6ec4d4ba73a089fafb5bbd81106e04470304
parent2a408cc988e83353556a910a7dfe3cf021d7cd44 (diff)
when we are calling an implemented function, call it using the signature it is implemented as, to avoid issues with LLVM casting for no reason
-rw-r--r--src/jsifier.js7
-rw-r--r--src/modules.js9
-rw-r--r--tests/cases/sillyfuncast.ll23
3 files changed, 38 insertions, 1 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index 38581ce4..e86a345d 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -1498,7 +1498,12 @@ function JSify(data, functionsOnly, givenFunctions) {
var returnType = 'void';
if ((byPointer || ASM_JS) && hasReturn) {
- returnType = getReturnType(type);
+ if (callIdent in Functions.implementedFunctions) {
+ // LLVM sometimes bitcasts for no reason. We must call using the exact same type as the actual function is generated as
+ returnType = Functions.getSignatureReturnType(Functions.implementedFunctions[callIdent]);
+ } else {
+ returnType = getReturnType(type);
+ }
}
if (byPointer) {
diff --git a/src/modules.js b/src/modules.js
index 53d97817..8cfc38de 100644
--- a/src/modules.js
+++ b/src/modules.js
@@ -258,6 +258,15 @@ var Functions = {
return sig;
},
+ getSignatureReturnType: function(sig) {
+ switch(sig[0]) {
+ case 'v': return 'void';
+ case 'i': return 'i32';
+ case 'f': return 'double';
+ default: throw 'what is this sig? ' + sig;
+ }
+ },
+
// Mark a function as needing indexing. Python will coordinate them all
getIndex: function(ident, doNotCreate, sig) {
if (doNotCreate && !(ident in this.indexedFunctions)) {
diff --git a/tests/cases/sillyfuncast.ll b/tests/cases/sillyfuncast.ll
new file mode 100644
index 00000000..36c26720
--- /dev/null
+++ b/tests/cases/sillyfuncast.ll
@@ -0,0 +1,23 @@
+; ModuleID = 'tests/hello_world.bc'
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
+target triple = "i386-pc-linux-gnu"
+
+@.str = private unnamed_addr constant [15 x i8] c"hello, world!\0A\00", align 1 ; [#uses=1 type=[15 x i8]*]
+
+define void @doit() {
+ %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([15 x i8]* @.str, i32 0, i32 0)) ; [#uses=0 type=i32]
+ ret void
+}
+
+define i32 @main() {
+entry:
+ %retval = alloca i32, align 4 ; [#uses=1 type=i32*]
+ store i32 0, i32* %retval
+ %58 = tail call i32 bitcast (void ()* @doit to i32 ()*)() nounwind
+ ret i32 1
+}
+
+declare i32 @printf(i8*, ...)
+
+
+