mirror of
https://github.com/ziglang/zig.git
synced 2025-12-12 17:23:09 +00:00
stage1: deal with WebAssembly not supporting @returnAddress()
This makes `@returnAddress()` return 0 for WebAssembly (when not using the Emscripten OS) and avoids trying to capture stack traces for the general purpose allocator on that target.
This commit is contained in:
parent
9f5a7d5922
commit
1b1921f0e2
@ -37,7 +37,7 @@ var c_allocator_state = Allocator{
|
|||||||
.resizeFn = cResize,
|
.resizeFn = cResize,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn cAlloc(self: *Allocator, len: usize, ptr_align: u29, len_align: u29) Allocator.Error![]u8 {
|
fn cAlloc(self: *Allocator, len: usize, ptr_align: u29, len_align: u29, ret_addr: usize) Allocator.Error![]u8 {
|
||||||
assert(ptr_align <= @alignOf(c_longdouble));
|
assert(ptr_align <= @alignOf(c_longdouble));
|
||||||
const ptr = @ptrCast([*]u8, c.malloc(len) orelse return error.OutOfMemory);
|
const ptr = @ptrCast([*]u8, c.malloc(len) orelse return error.OutOfMemory);
|
||||||
if (len_align == 0) {
|
if (len_align == 0) {
|
||||||
@ -54,7 +54,14 @@ fn cAlloc(self: *Allocator, len: usize, ptr_align: u29, len_align: u29) Allocato
|
|||||||
return ptr[0..mem.alignBackwardAnyAlign(full_len, len_align)];
|
return ptr[0..mem.alignBackwardAnyAlign(full_len, len_align)];
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cResize(self: *Allocator, buf: []u8, old_align: u29, new_len: usize, len_align: u29) Allocator.Error!usize {
|
fn cResize(
|
||||||
|
self: *Allocator,
|
||||||
|
buf: []u8,
|
||||||
|
old_align: u29,
|
||||||
|
new_len: usize,
|
||||||
|
len_align: u29,
|
||||||
|
ret_addr: usize,
|
||||||
|
) Allocator.Error!usize {
|
||||||
if (new_len == 0) {
|
if (new_len == 0) {
|
||||||
c.free(buf.ptr);
|
c.free(buf.ptr);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -102,9 +102,12 @@ const StackTrace = std.builtin.StackTrace;
|
|||||||
/// Integer type for pointing to slots in a small allocation
|
/// Integer type for pointing to slots in a small allocation
|
||||||
const SlotIndex = std.meta.Int(false, math.log2(page_size) + 1);
|
const SlotIndex = std.meta.Int(false, math.log2(page_size) + 1);
|
||||||
|
|
||||||
|
// WebAssembly doesn't support stack tracing yet.
|
||||||
|
const default_stack_trace_frames: usize = if (std.Target.current.cpu.arch.isWasm()) 0 else 4;
|
||||||
|
|
||||||
pub const Config = struct {
|
pub const Config = struct {
|
||||||
/// Number of stack frames to capture.
|
/// Number of stack frames to capture.
|
||||||
stack_trace_frames: usize = if (std.debug.runtime_safety) @as(usize, 4) else @as(usize, 0),
|
stack_trace_frames: usize = if (std.debug.runtime_safety) default_stack_trace_frames else @as(usize, 0),
|
||||||
|
|
||||||
/// If true, the allocator will have two fields:
|
/// If true, the allocator will have two fields:
|
||||||
/// * `total_requested_bytes` which tracks the total allocated bytes of memory requested.
|
/// * `total_requested_bytes` which tracks the total allocated bytes of memory requested.
|
||||||
|
|||||||
@ -5886,6 +5886,12 @@ static LLVMValueRef ir_render_breakpoint(CodeGen *g, IrExecutableGen *executable
|
|||||||
static LLVMValueRef ir_render_return_address(CodeGen *g, IrExecutableGen *executable,
|
static LLVMValueRef ir_render_return_address(CodeGen *g, IrExecutableGen *executable,
|
||||||
IrInstGenReturnAddress *instruction)
|
IrInstGenReturnAddress *instruction)
|
||||||
{
|
{
|
||||||
|
if (target_is_wasm(g->zig_target) && g->zig_target->os != OsEmscripten) {
|
||||||
|
// I got this error from LLVM 10:
|
||||||
|
// "Non-Emscripten WebAssembly hasn't implemented __builtin_return_address"
|
||||||
|
return LLVMConstNull(get_llvm_type(g, instruction->base.value->type));
|
||||||
|
}
|
||||||
|
|
||||||
LLVMValueRef zero = LLVMConstNull(g->builtin_types.entry_i32->llvm_type);
|
LLVMValueRef zero = LLVMConstNull(g->builtin_types.entry_i32->llvm_type);
|
||||||
LLVMValueRef ptr_val = LLVMBuildCall(g->builder, get_return_address_fn_val(g), &zero, 1, "");
|
LLVMValueRef ptr_val = LLVMBuildCall(g->builder, get_return_address_fn_val(g), &zero, 1, "");
|
||||||
return LLVMBuildPtrToInt(g->builder, ptr_val, g->builtin_types.entry_usize->llvm_type, "");
|
return LLVMBuildPtrToInt(g->builder, ptr_val, g->builtin_types.entry_usize->llvm_type, "");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user