mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Do not produce expression locations for windows.
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
- Crash compiling for arm64 when returning 16 byte and smaller structs by value not a power of 2 #1649.
|
- Crash compiling for arm64 when returning 16 byte and smaller structs by value not a power of 2 #1649.
|
||||||
- Enforce single module compilation for static libraries to make constructors run properly.
|
- Enforce single module compilation for static libraries to make constructors run properly.
|
||||||
- Crash when using --no-obj without compile-only. #1653
|
- Crash when using --no-obj without compile-only. #1653
|
||||||
|
- Do not produce expression locations for windows.
|
||||||
|
|
||||||
### Stdlib changes
|
### Stdlib changes
|
||||||
- Add `io::MultiReader`, `io::MultiWriter`, and `io::TeeReader` structs.
|
- Add `io::MultiReader`, `io::MultiWriter`, and `io::TeeReader` structs.
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ static void llvm_emit_debug_declare(GenContext *c, LLVMValueRef var, LLVMMetadat
|
|||||||
void llvm_emit_debug_local_var(GenContext *c, Decl *decl)
|
void llvm_emit_debug_local_var(GenContext *c, Decl *decl)
|
||||||
{
|
{
|
||||||
ASSERT0(llvm_is_local_eval(c));
|
ASSERT0(llvm_is_local_eval(c));
|
||||||
EMIT_LOC(c, decl);
|
EMIT_EXPR_LOC(c, decl);
|
||||||
uint32_t row = decl->span.row;
|
uint32_t row = decl->span.row;
|
||||||
uint32_t col = decl->span.col;
|
uint32_t col = decl->span.col;
|
||||||
if (!row) row = 1;
|
if (!row) row = 1;
|
||||||
|
|||||||
@@ -1397,7 +1397,7 @@ void llvm_emit_ignored_expr(GenContext *c, Expr *expr)
|
|||||||
PUSH_CATCH_VAR_BLOCK(NULL, discard_fail);
|
PUSH_CATCH_VAR_BLOCK(NULL, discard_fail);
|
||||||
llvm_emit_expr(c, &value, expr);
|
llvm_emit_expr(c, &value, expr);
|
||||||
llvm_value_fold_optional(c, &value);
|
llvm_value_fold_optional(c, &value);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
// We only optimize if there is no instruction the current block
|
// We only optimize if there is no instruction the current block
|
||||||
if (!LLVMGetFirstInstruction(c->current_block))
|
if (!LLVMGetFirstInstruction(c->current_block))
|
||||||
{
|
{
|
||||||
@@ -2458,7 +2458,7 @@ static inline LLVMValueRef llvm_emit_inc_dec_value(GenContext *c, SourceSpan spa
|
|||||||
static inline void llvm_emit_inc_dec_change(GenContext *c, BEValue *addr, BEValue *after, BEValue *before,
|
static inline void llvm_emit_inc_dec_change(GenContext *c, BEValue *addr, BEValue *after, BEValue *before,
|
||||||
Expr *expr, int diff, bool allow_wrap)
|
Expr *expr, int diff, bool allow_wrap)
|
||||||
{
|
{
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
|
|
||||||
// Copy the address and make it a value.
|
// Copy the address and make it a value.
|
||||||
BEValue value = *addr;
|
BEValue value = *addr;
|
||||||
@@ -3278,7 +3278,7 @@ static void llvm_emit_slice_assign(GenContext *c, BEValue *be_value, Expr *expr)
|
|||||||
|
|
||||||
// We emit a phi here: value is either the start value (start_offset) or the next value (next_offset)
|
// We emit a phi here: value is either the start value (start_offset) or the next value (next_offset)
|
||||||
// but we haven't generated the latter yet, so we defer that.
|
// but we haven't generated the latter yet, so we defer that.
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
LLVMValueRef offset = LLVMBuildPhi(c->builder, llvm_get_type(c, start.type), "");
|
LLVMValueRef offset = LLVMBuildPhi(c->builder, llvm_get_type(c, start.type), "");
|
||||||
BEValue offset_val;
|
BEValue offset_val;
|
||||||
llvm_value_set(&offset_val, offset, start.type);
|
llvm_value_set(&offset_val, offset, start.type);
|
||||||
@@ -3289,7 +3289,7 @@ static void llvm_emit_slice_assign(GenContext *c, BEValue *be_value, Expr *expr)
|
|||||||
llvm_emit_int_comp_raw(c, &value, start.type, end.type, offset, end.value, op);
|
llvm_emit_int_comp_raw(c, &value, start.type, end.type, offset, end.value, op);
|
||||||
|
|
||||||
// If jump to the assign block if we're not at the end index.
|
// If jump to the assign block if we're not at the end index.
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
llvm_emit_cond_br(c, &value, assign_block, exit_block);
|
llvm_emit_cond_br(c, &value, assign_block, exit_block);
|
||||||
|
|
||||||
// Emit the assign.
|
// Emit the assign.
|
||||||
@@ -4377,7 +4377,7 @@ void llvm_emit_binary(GenContext *c, BEValue *be_value, Expr *expr, BEValue *lhs
|
|||||||
BEValue rhs;
|
BEValue rhs;
|
||||||
llvm_emit_expr(c, &rhs, exprptr(expr->binary_expr.right));
|
llvm_emit_expr(c, &rhs, exprptr(expr->binary_expr.right));
|
||||||
llvm_fold_for_compare(c, &rhs);
|
llvm_fold_for_compare(c, &rhs);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
// Comparison <=>
|
// Comparison <=>
|
||||||
if (binary_op >= BINARYOP_GT && binary_op <= BINARYOP_EQ)
|
if (binary_op >= BINARYOP_GT && binary_op <= BINARYOP_EQ)
|
||||||
{
|
{
|
||||||
@@ -4709,7 +4709,7 @@ static inline void llvm_emit_force_unwrap_expr(GenContext *c, BEValue *be_value,
|
|||||||
llvm_emit_panic(c, "Force unwrap failed!", loc, "Unexpected fault '%s' was unwrapped!", varargs);
|
llvm_emit_panic(c, "Force unwrap failed!", loc, "Unexpected fault '%s' was unwrapped!", varargs);
|
||||||
}
|
}
|
||||||
llvm_emit_block(c, no_err_block);
|
llvm_emit_block(c, no_err_block);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -6349,7 +6349,7 @@ static void llvm_emit_call_expr(GenContext *c, BEValue *result_value, Expr *expr
|
|||||||
scratch_buffer_printf("No method '%s' could be found on target", dyn_fn->name);
|
scratch_buffer_printf("No method '%s' could be found on target", dyn_fn->name);
|
||||||
llvm_emit_panic(c, scratch_buffer_to_string(), expr->span, NULL, NULL);
|
llvm_emit_panic(c, scratch_buffer_to_string(), expr->span, NULL, NULL);
|
||||||
llvm_emit_block(c, match);
|
llvm_emit_block(c, match);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
values[0] = result;
|
values[0] = result;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -6861,7 +6861,7 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex
|
|||||||
}
|
}
|
||||||
llvm_emit_panic(c, "Attempted to access 'inner' on non composite type", expr->span, NULL, NULL);
|
llvm_emit_panic(c, "Attempted to access 'inner' on non composite type", expr->span, NULL, NULL);
|
||||||
llvm_emit_block(c, exit);
|
llvm_emit_block(c, exit);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_INNER, align, &alignment);
|
LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_INNER, align, &alignment);
|
||||||
@@ -6890,7 +6890,7 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex
|
|||||||
}
|
}
|
||||||
llvm_emit_panic(c, "Attempted to access 'names' on non enum/fault type.", expr->span, NULL, NULL);
|
llvm_emit_panic(c, "Attempted to access 'names' on non enum/fault type.", expr->span, NULL, NULL);
|
||||||
llvm_emit_block(c, exit);
|
llvm_emit_block(c, exit);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
LLVMValueRef len = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_LEN, align, &alignment);
|
LLVMValueRef len = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_LEN, align, &alignment);
|
||||||
@@ -6923,7 +6923,7 @@ static inline void llvm_emit_typeid_info(GenContext *c, BEValue *value, Expr *ex
|
|||||||
}
|
}
|
||||||
llvm_emit_panic(c, "Attempted to access 'len' on non array type", expr->span, NULL, NULL);
|
llvm_emit_panic(c, "Attempted to access 'len' on non array type", expr->span, NULL, NULL);
|
||||||
llvm_emit_block(c, exit);
|
llvm_emit_block(c, exit);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_LEN, align, &alignment);
|
LLVMValueRef val = llvm_emit_struct_gep_raw(c, ref, c->introspect_type, INTROSPECT_INDEX_LEN, align, &alignment);
|
||||||
@@ -7239,7 +7239,7 @@ void llvm_emit_expr_global_value(GenContext *c, BEValue *value, Expr *expr)
|
|||||||
}
|
}
|
||||||
void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr)
|
void llvm_emit_expr(GenContext *c, BEValue *value, Expr *expr)
|
||||||
{
|
{
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
switch (expr->expr_kind)
|
switch (expr->expr_kind)
|
||||||
{
|
{
|
||||||
case NON_RUNTIME_EXPR:
|
case NON_RUNTIME_EXPR:
|
||||||
|
|||||||
@@ -52,9 +52,11 @@ typedef struct DebugScope_
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
unsigned runtime_version : 8;
|
bool enable_stacktrace;
|
||||||
bool enable_stacktrace : 1;
|
bool emit_expr_loc;
|
||||||
|
unsigned runtime_version;
|
||||||
LLVMDIBuilderRef builder;
|
LLVMDIBuilderRef builder;
|
||||||
|
|
||||||
DebugFile *debug_files;
|
DebugFile *debug_files;
|
||||||
DebugFile file;
|
DebugFile file;
|
||||||
LLVMMetadataRef compile_unit;
|
LLVMMetadataRef compile_unit;
|
||||||
@@ -574,7 +576,8 @@ void llvm_emit_debug_local_var(GenContext *c, Decl *var);
|
|||||||
|
|
||||||
#define UWTABLE (compiler.build.arch_os_target == MACOS_AARCH64 ? 1 : 2)
|
#define UWTABLE (compiler.build.arch_os_target == MACOS_AARCH64 ? 1 : 2)
|
||||||
#define EMIT_LOC(c, x) do { if (c->debug.builder) llvm_emit_debug_location(c, x->span); } while (0)
|
#define EMIT_LOC(c, x) do { if (c->debug.builder) llvm_emit_debug_location(c, x->span); } while (0)
|
||||||
#define EMIT_SPAN(c, x) do { if (c->debug.builder) llvm_emit_debug_location(c, x); } while (0)
|
#define EMIT_EXPR_LOC(c, x) do { if (c->debug.emit_expr_loc) llvm_emit_debug_location(c, x->span); } while (0)
|
||||||
|
#define EMIT_SPAN(c, x) do { if (c->debug.emit_expr_loc) llvm_emit_debug_location(c, x); } while (0)
|
||||||
#define PUSH_DEFER_ERROR(val__) LLVMValueRef def_err__ = c->defer_error_var; c->defer_error_var = val__
|
#define PUSH_DEFER_ERROR(val__) LLVMValueRef def_err__ = c->defer_error_var; c->defer_error_var = val__
|
||||||
#define POP_DEFER_ERROR() c->defer_error_var = def_err__
|
#define POP_DEFER_ERROR() c->defer_error_var = def_err__
|
||||||
|
|
||||||
|
|||||||
@@ -127,11 +127,14 @@ void gencontext_begin_module(GenContext *c)
|
|||||||
if (c->panic_var) c->panic_var->backend_ref = NULL;
|
if (c->panic_var) c->panic_var->backend_ref = NULL;
|
||||||
if (c->panicf) c->panicf->backend_ref = NULL;
|
if (c->panicf) c->panicf->backend_ref = NULL;
|
||||||
bool is_win = compiler.build.arch_os_target == WINDOWS_X64 || compiler.build.arch_os_target == WINDOWS_AARCH64;
|
bool is_win = compiler.build.arch_os_target == WINDOWS_X64 || compiler.build.arch_os_target == WINDOWS_AARCH64;
|
||||||
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "Dwarf Version", 4, type_uint);
|
|
||||||
if (is_win)
|
if (is_win)
|
||||||
{
|
{
|
||||||
llvm_set_module_flag(c, LLVMModuleFlagBehaviorError, "CodeView", 1, type_uint);
|
llvm_set_module_flag(c, LLVMModuleFlagBehaviorError, "CodeView", 1, type_uint);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "Dwarf Version", 4, type_uint);
|
||||||
|
}
|
||||||
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "Debug Info Version", 3, type_uint);
|
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "Debug Info Version", 3, type_uint);
|
||||||
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "wchar_size", is_win ? 2 : 4, type_uint);
|
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "wchar_size", is_win ? 2 : 4, type_uint);
|
||||||
static const char *pic_level = "PIC Level";
|
static const char *pic_level = "PIC Level";
|
||||||
@@ -156,7 +159,7 @@ void gencontext_begin_module(GenContext *c)
|
|||||||
llvm_set_module_flag(c, LLVMModuleFlagBehaviorError, "uwtable", UWTABLE, type_uint);
|
llvm_set_module_flag(c, LLVMModuleFlagBehaviorError, "uwtable", UWTABLE, type_uint);
|
||||||
if (is_win)
|
if (is_win)
|
||||||
{
|
{
|
||||||
llvm_set_module_flag(c, LLVMModuleFlagBehaviorWarning, "MaxTLSAlign", 65536, type_uint);
|
llvm_set_module_flag(c, LLVMModuleFlagBehaviorError, "MaxTLSAlign", 65536, type_uint);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -172,6 +175,7 @@ void gencontext_begin_module(GenContext *c)
|
|||||||
{
|
{
|
||||||
c->debug.enable_stacktrace = os_supports_stacktrace(compiler.platform.os);
|
c->debug.enable_stacktrace = os_supports_stacktrace(compiler.platform.os);
|
||||||
}
|
}
|
||||||
|
c->debug.emit_expr_loc = !is_win;
|
||||||
}
|
}
|
||||||
c->global_builder = LLVMCreateBuilder();
|
c->global_builder = LLVMCreateBuilder();
|
||||||
c->builder = c->global_builder;
|
c->builder = c->global_builder;
|
||||||
|
|||||||
@@ -1167,7 +1167,7 @@ static inline void llvm_emit_assume(GenContext *c, Expr *expr)
|
|||||||
llvm_emit_expr(c, &value, expr);
|
llvm_emit_expr(c, &value, expr);
|
||||||
llvm_value_rvalue(c, &value);
|
llvm_value_rvalue(c, &value);
|
||||||
ASSERT0(value.kind == BE_BOOLEAN);
|
ASSERT0(value.kind == BE_BOOLEAN);
|
||||||
EMIT_LOC(c, expr);
|
EMIT_EXPR_LOC(c, expr);
|
||||||
llvm_emit_assume_true(c, &value);
|
llvm_emit_assume_true(c, &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user