Skip to content

Commit

Permalink
Merge pull request #6255 from roc-lang/glue-panic-handler
Browse files Browse the repository at this point in the history
make glue use a setjmp/longjmp panic handler
  • Loading branch information
rtfeldman committed Dec 11, 2023
2 parents b9425bf + 67d7385 commit 95a4bb9
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 54 deletions.
80 changes: 59 additions & 21 deletions crates/compiler/gen_llvm/src/llvm/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -710,7 +710,7 @@ impl LlvmBackendMode {
match self {
LlvmBackendMode::Binary => false,
LlvmBackendMode::BinaryDev => false,
LlvmBackendMode::BinaryGlue => false,
LlvmBackendMode::BinaryGlue => true,
LlvmBackendMode::GenTest => true,
LlvmBackendMode::WasmGenTest => true,
LlvmBackendMode::CliTest => true,
Expand Down Expand Up @@ -4437,31 +4437,68 @@ fn expose_function_to_host_help_c_abi_generic<'a, 'ctx>(
}
}

let arguments_for_call = &arguments_for_call.into_bump_slice();

let call_result = if env.mode.returns_roc_result() {
debug_assert_eq!(args.len(), roc_function.get_params().len());
if args.len() == roc_function.get_params().len() {
let arguments_for_call = &arguments_for_call.into_bump_slice();

let dbg_loc = builder.get_current_debug_location().unwrap();
let roc_wrapper_function =
make_exception_catcher(env, layout_interner, roc_function, return_layout);
debug_assert_eq!(
arguments_for_call.len(),
roc_wrapper_function.get_params().len()
);

let dbg_loc = builder.get_current_debug_location().unwrap();
let roc_wrapper_function =
make_exception_catcher(env, layout_interner, roc_function, return_layout);
debug_assert_eq!(
arguments_for_call.len(),
roc_wrapper_function.get_params().len()
);
builder.position_at_end(entry);
builder.set_current_debug_location(dbg_loc);

builder.position_at_end(entry);
builder.set_current_debug_location(dbg_loc);
let wrapped_layout = roc_call_result_layout(env.arena, return_layout);
call_direct_roc_function(
env,
layout_interner,
roc_function,
wrapped_layout,
arguments_for_call,
)
} else {
debug_assert_eq!(args.len() + 1, roc_function.get_params().len());

let wrapped_layout = roc_call_result_layout(env.arena, return_layout);
call_direct_roc_function(
env,
layout_interner,
roc_function,
wrapped_layout,
arguments_for_call,
)
arguments_for_call.push(args[0]);

let arguments_for_call = &arguments_for_call.into_bump_slice();

let dbg_loc = builder.get_current_debug_location().unwrap();
let roc_wrapper_function =
make_exception_catcher(env, layout_interner, roc_function, return_layout);

builder.position_at_end(entry);
builder.set_current_debug_location(dbg_loc);

let wrapped_layout = roc_call_result_layout(env.arena, return_layout);
let call_result = call_direct_roc_function(
env,
layout_interner,
roc_wrapper_function,
wrapped_layout,
arguments_for_call,
);

let output_arg_index = 0;

let output_arg = c_function
.get_nth_param(output_arg_index as u32)
.unwrap()
.into_pointer_value();

env.builder.new_build_store(output_arg, call_result);

builder.new_build_return(None);

return c_function;
}
} else {
let arguments_for_call = &arguments_for_call.into_bump_slice();

call_direct_roc_function(
env,
layout_interner,
Expand All @@ -4485,6 +4522,7 @@ fn expose_function_to_host_help_c_abi_generic<'a, 'ctx>(
output_arg,
call_result,
);

builder.new_build_return(None);

c_function
Expand Down
56 changes: 28 additions & 28 deletions crates/glue/src/glue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -998,7 +998,7 @@ impl RocType {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -1016,7 +1016,7 @@ impl RocType {
debug_assert_eq!(self.discriminant(), discriminant_RocType::Function);
let payload = &self.Function;


payload
}

Expand Down Expand Up @@ -1196,7 +1196,7 @@ impl RocType {
let payload = self.RocDict;

(
payload.f0,
payload.f0,
payload.f1
)
}
Expand All @@ -1214,7 +1214,7 @@ impl RocType {
let payload = &self.RocDict;

(
&payload.f0,
&payload.f0,
&payload.f1
)
}
Expand Down Expand Up @@ -1297,7 +1297,7 @@ impl RocType {
let payload = self.RocResult;

(
payload.f0,
payload.f0,
payload.f1
)
}
Expand All @@ -1315,7 +1315,7 @@ impl RocType {
let payload = &self.RocResult;

(
&payload.f0,
&payload.f0,
&payload.f1
)
}
Expand Down Expand Up @@ -1450,7 +1450,7 @@ impl RocType {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -1468,7 +1468,7 @@ impl RocType {
debug_assert_eq!(self.discriminant(), discriminant_RocType::Struct);
let payload = &self.Struct;


payload
}

Expand Down Expand Up @@ -1580,7 +1580,7 @@ impl RocType {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -1598,7 +1598,7 @@ impl RocType {
debug_assert_eq!(self.discriminant(), discriminant_RocType::TagUnionPayload);
let payload = &self.TagUnionPayload;


payload
}

Expand Down Expand Up @@ -1810,7 +1810,7 @@ impl RocType {
let payload = self.RocDict;

(
payload.f0,
payload.f0,
payload.f1
)
}
Expand All @@ -1827,7 +1827,7 @@ impl RocType {
let payload = &self.RocDict;

(
&payload.f0,
&payload.f0,
&payload.f1
)
}
Expand Down Expand Up @@ -1905,7 +1905,7 @@ impl RocType {
let payload = self.RocResult;

(
payload.f0,
payload.f0,
payload.f1
)
}
Expand All @@ -1922,7 +1922,7 @@ impl RocType {
let payload = &self.RocResult;

(
&payload.f0,
&payload.f0,
&payload.f1
)
}
Expand Down Expand Up @@ -2398,7 +2398,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2416,7 +2416,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::Enumeration);
let payload = &self.Enumeration;


payload
}

Expand Down Expand Up @@ -2464,7 +2464,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2482,7 +2482,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::NonNullableUnwrapped);
let payload = &self.NonNullableUnwrapped;


payload
}

Expand Down Expand Up @@ -2530,7 +2530,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2548,7 +2548,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::NonRecursive);
let payload = &self.NonRecursive;


payload
}

Expand Down Expand Up @@ -2596,7 +2596,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2614,7 +2614,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::NullableUnwrapped);
let payload = &self.NullableUnwrapped;


payload
}

Expand Down Expand Up @@ -2662,7 +2662,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2680,7 +2680,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::NullableWrapped);
let payload = &self.NullableWrapped;


payload
}

Expand Down Expand Up @@ -2728,7 +2728,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2746,7 +2746,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::Recursive);
let payload = &self.Recursive;


payload
}

Expand Down Expand Up @@ -2794,7 +2794,7 @@ impl RocTagUnion {
core::mem::ManuallyDrop::into_inner(swapped)
};


payload
}

Expand All @@ -2812,7 +2812,7 @@ impl RocTagUnion {
debug_assert_eq!(self.discriminant(), discriminant_RocTagUnion::SingleTagStruct);
let payload = &self.SingleTagStruct;


payload
}

Expand Down
Loading

0 comments on commit 95a4bb9

Please sign in to comment.