summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ir/context.rs8
-rw-r--r--src/ir/function.rs10
2 files changed, 17 insertions, 1 deletions
diff --git a/src/ir/context.rs b/src/ir/context.rs
index 79c682e0..bb0c3f9d 100644
--- a/src/ir/context.rs
+++ b/src/ir/context.rs
@@ -577,6 +577,14 @@ If you encounter an error missing from this list, please file an issue or a PR!"
}
}
+ /// Returns `true` if the target architecture is wasm32
+ pub fn is_target_wasm32(&self) -> bool {
+ match self.target_info {
+ Some(ref ti) => ti.triple.starts_with("wasm32-"),
+ None => false,
+ }
+ }
+
/// Creates a timer for the current bindgen phase. If time_phases is `true`,
/// the timer will print to stderr when it is dropped, otherwise it will do
/// nothing.
diff --git a/src/ir/function.rs b/src/ir/function.rs
index 93a8d89f..0eecf960 100644
--- a/src/ir/function.rs
+++ b/src/ir/function.rs
@@ -495,7 +495,15 @@ impl FunctionSig {
} else {
ty.ret_type().ok_or(ParseError::Continue)?
};
- let ret = Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx);
+
+ let ret = if ctx.is_target_wasm32() && is_constructor {
+ // Constructors in Clang wasm32 target return a pointer to the object
+ // being constructed.
+ let void = Item::builtin_type(TypeKind::Void, false, ctx);
+ Item::builtin_type(TypeKind::Pointer(void), false, ctx)
+ } else {
+ Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx)
+ };
// Clang plays with us at "find the calling convention", see #549 and
// co. This seems to be a better fix than that commit.