From 96fbafe3598822d8d62791d881879c4da33431ea Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 21 Sep 2023 10:38:44 +0100 Subject: Update ABI breaking changes for `f16` types (due to LLVM 15+) --- src/checker.cpp | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/checker.cpp') diff --git a/src/checker.cpp b/src/checker.cpp index 18d403d80..0be912df5 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -935,6 +935,7 @@ gb_internal i64 odin_compile_timestamp(void) { return ns_after_1970; } +gb_internal bool lb_use_new_pass_system(void); gb_internal void init_universal(void) { BuildContext *bc = &build_context; @@ -1083,6 +1084,8 @@ gb_internal void init_universal(void) { add_global_constant("ODIN_COMPILE_TIMESTAMP", t_untyped_integer, exact_value_i64(odin_compile_timestamp())); + add_global_bool_constant("__ODIN_LLVM_F16_SUPPORTED", lb_use_new_pass_system()); + // Builtin Procedures for (isize i = 0; i < gb_count_of(builtin_procs); i++) { -- cgit v1.2.3 From 38d2a0ddb9b1e74661dd05fae71e3a2d47e8de2c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 21 Sep 2023 11:13:26 +0100 Subject: Add `sanitize_address` attribute to all normal packages --- src/checker.cpp | 2 +- src/docs_writer.cpp | 6 ++---- src/llvm_backend_proc.cpp | 7 ++++++- src/parser.hpp | 1 + 4 files changed, 10 insertions(+), 6 deletions(-) (limited to 'src/checker.cpp') diff --git a/src/checker.cpp b/src/checker.cpp index 0be912df5..cda7d50a0 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -858,7 +858,7 @@ gb_internal AstPackage *create_builtin_package(char const *name) { gbAllocator a = permanent_allocator(); AstPackage *pkg = gb_alloc_item(a, AstPackage); pkg->name = make_string_c(name); - pkg->kind = Package_Normal; + pkg->kind = Package_Builtin; pkg->scope = create_scope(nullptr, nullptr); pkg->scope->flags |= ScopeFlag_Pkg | ScopeFlag_Global | ScopeFlag_Builtin; diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 6b42d2e7a..6816ae8eb 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -1101,11 +1101,9 @@ gb_internal void odin_doc_write_docs(OdinDocWriter *w) { case Package_Init: pkg_flags |= OdinDocPkgFlag_Init; break; - } - if (pkg->name == "builtin") { - pkg_flags |= OdinDocPkgFlag_Builtin; - } else if (pkg->name == "intrinsics") { + case Package_Builtin: pkg_flags |= OdinDocPkgFlag_Builtin; + break; } OdinDocPkg doc_pkg = {}; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index b8f6f0f30..f86e008a9 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -152,7 +152,6 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_add_attribute_to_proc(m, p->value, "noredzone"); } - switch (p->inlining) { case ProcInlining_inline: lb_add_attribute_to_proc(m, p->value, "alwaysinline"); @@ -318,6 +317,12 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } } + if (p->body && entity->pkg && (entity->pkg->kind == Package_Normal) || (entity->pkg->kind == Package_Init)) { + if (build_context.sanitizer_flags & SanitizerFlag_Address) { + lb_add_attribute_to_proc(m, p->value, "sanitize_address"); + } + } + lbValue proc_value = {p->value, p->type}; lb_add_entity(m, entity, proc_value); lb_add_member(m, p->name, proc_value); diff --git a/src/parser.hpp b/src/parser.hpp index eace5ba86..dd7bd0928 100644 --- a/src/parser.hpp +++ b/src/parser.hpp @@ -60,6 +60,7 @@ enum PackageKind { Package_Normal, Package_Runtime, Package_Init, + Package_Builtin, }; struct ImportedFile { -- cgit v1.2.3 From 098c09835b1b1dd08431a59f076e77bb0125d93a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 21 Sep 2023 11:34:40 +0100 Subject: Add `ODIN_SANITIZER_FLAGS` global constant --- core/runtime/core.odin | 13 +++++++++++++ src/checker.cpp | 27 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) (limited to 'src/checker.cpp') diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 0634f573a..44717f8d0 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -510,6 +510,19 @@ Odin_Endian_Type :: type_of(ODIN_ENDIAN) */ Odin_Platform_Subtarget_Type :: type_of(ODIN_PLATFORM_SUBTARGET) +/* + // Defined internally by the compiler + Odin_Sanitizer_Flag :: enum u32 { + Address = 0, + Memory = 1, + Thread = 2, + } + Odin_Sanitizer_Flags :: distinct bitset[Odin_Sanitizer_Flag; u32] + + ODIN_SANITIZER_FLAGS // is a constant +*/ +Odin_Sanitizer_Flags :: type_of(ODIN_SANITIZER_FLAGS) + ///////////////////////////// // Init Startup Procedures // diff --git a/src/checker.cpp b/src/checker.cpp index cda7d50a0..984a00a90 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1086,6 +1086,33 @@ gb_internal void init_universal(void) { add_global_bool_constant("__ODIN_LLVM_F16_SUPPORTED", lb_use_new_pass_system()); + { + GlobalEnumValue values[3] = { + {"Address", 0}, + {"Memory", 1}, + {"Thread", 2}, + }; + + Type *enum_type = nullptr; + auto flags = add_global_enum_type(str_lit("Odin_Sanitizer_Flag"), values, gb_count_of(values), &enum_type); + Type *bit_set_type = alloc_type_bit_set(); + bit_set_type->BitSet.elem = enum_type; + bit_set_type->BitSet.underlying = t_u32; + bit_set_type->BitSet.lower = 0; + bit_set_type->BitSet.upper = 2; + type_size_of(bit_set_type); + + String type_name = str_lit("Odin_Sanitizer_Flags"); + Scope *scope = create_scope(nullptr, builtin_pkg->scope); + Entity *entity = alloc_entity_type_name(scope, make_token_ident(type_name), nullptr, EntityState_Resolved); + + Type *named_type = alloc_type_named(type_name, bit_set_type, entity); + set_base_type(named_type, bit_set_type); + + add_global_constant("ODIN_SANITIZER_FLAGS", named_type, exact_value_u64(bc->sanitizer_flags)); + } + + // Builtin Procedures for (isize i = 0; i < gb_count_of(builtin_procs); i++) { -- cgit v1.2.3