diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e616de43e..af1f7c196 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -90,14 +90,14 @@ jobs: with: msystem: MINGW64 update: true - install: git binutils mingw-w64-x86_64-ninja mingw-w64-x86_64-cmake mingw-w64-x86_64-toolchain mingw-w64-x86_64-python + install: git binutils mingw-w64-x86_64-clang mingw-w64-x86_64-ninja mingw-w64-x86_64-cmake mingw-w64-x86_64-toolchain mingw-w64-x86_64-python - shell: msys2 {0} run: | pacman --noconfirm -U https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-llvm-16.0.5-1-any.pkg.tar.zst pacman --noconfirm -U https://mirror.msys2.org/mingw/mingw64/mingw-w64-x86_64-lld-16.0.5-1-any.pkg.tar.zst - name: CMake run: | - cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} + cmake -B build -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_BUILD_TYPE=${{ matrix.build_type }} cmake --build build - name: Compile and run some examples diff --git a/CMakeLists.txt b/CMakeLists.txt index 3af47df21..18d8f271e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,6 @@ message("C3C version: ${CMAKE_PROJECT_VERSION}") include(FetchContent) include(FeatureSummary) - set(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL) set(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC) diff --git a/src/compiler/linker.c b/src/compiler/linker.c index d695237aa..ed299d7cb 100644 --- a/src/compiler/linker.c +++ b/src/compiler/linker.c @@ -148,6 +148,7 @@ static void linker_setup_windows(const char ***args_ref, LinkerType linker_type) add_arg("user32.lib"); add_arg("shell32.lib"); add_arg("Shlwapi.lib"); + add_arg("Ws2_32.lib"); add_arg("legacy_stdio_definitions.lib"); if (active_target.win.crt_linking == WIN_CRT_STATIC) diff --git a/src/compiler/llvm_codegen_debug_info.c b/src/compiler/llvm_codegen_debug_info.c index 3ae4e0bfd..8712bbd78 100644 --- a/src/compiler/llvm_codegen_debug_info.c +++ b/src/compiler/llvm_codegen_debug_info.c @@ -54,6 +54,7 @@ static inline LLVMMetadataRef llvm_get_debug_struct(GenContext *c, Type *type, c static inline LLVMMetadataRef llvm_get_debug_member(GenContext *c, Type *type, const char *name, unsigned offset, SourceSpan *loc, LLVMMetadataRef scope, LLVMDIFlags flags) { + assert(name && scope); return LLVMDIBuilderCreateMemberType( c->debug.builder, scope, @@ -108,32 +109,29 @@ void llvm_emit_debug_function(GenContext *c, Decl *decl) { LLVMDIFlags flags = LLVMDIFlagZero; if (!decl->func_decl.body) return; - if (decl_is_externally_visible(decl)) - { - flags |= LLVMDIFlagPublic; - } - else - { - flags |= LLVMDIFlagPrivate; - } flags |= LLVMDIFlagPrototyped; if (decl->func_decl.signature.attrs.noreturn) flags |= LLVMDIFlagNoReturn; uint32_t row = decl->span.row; if (!row) row = 1; + assert(decl->name); + assert(decl->extname); + assert(c->debug.file.debug_file); + LLVMMetadataRef debug_type = llvm_get_debug_type(c, decl->type); c->debug.function = LLVMDIBuilderCreateFunction(c->debug.builder, c->debug.file.debug_file, decl->name, strlen(decl->name), decl->extname, strlen(decl->extname), c->debug.file.debug_file, row, - llvm_get_debug_type(c, decl->type), + debug_type, decl_is_local(decl), true, row, flags, active_target.optimization_level != OPTIMIZATION_NONE); LLVMSetSubprogram(decl->backend_ref, c->debug.function); + } void llvm_emit_debug_local_var(GenContext *c, Decl *decl) @@ -514,6 +512,10 @@ static LLVMMetadataRef llvm_debug_func_type(GenContext *c, Type *type) { vec_add(buffer, llvm_get_debug_type(c, prototype->param_types[i])); } + if (prototype->raw_variadic) + { + vec_add(buffer, LLVMDIBuilderCreateUnspecifiedType(c->debug.builder, "", 0)); + } return LLVMDIBuilderCreateSubroutineType(c->debug.builder, c->debug.file.debug_file, buffer, diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 3edeee96a..0208bfb25 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -4365,9 +4365,6 @@ static void llvm_emit_binary_expr(GenContext *c, BEValue *be_value, Expr *expr) static inline void llvm_emit_elvis_expr(GenContext *c, BEValue *value, Expr *expr) { - // Set up basic blocks, following Cone - LLVMBasicBlockRef phi_block = llvm_basic_block_new(c, "cond.phi"); - LLVMBasicBlockRef rhs_block = llvm_basic_block_new(c, "cond.rhs"); // Generate condition and conditional branch Expr *cond = exprptr(expr->ternary_expr.cond); @@ -4396,6 +4393,10 @@ static inline void llvm_emit_elvis_expr(GenContext *c, BEValue *value, Expr *exp LLVMBasicBlockRef lhs_exit = llvm_get_current_block_if_in_use(c); if (!lhs_exit) return; + // Set up basic blocks, following Cone + LLVMBasicBlockRef phi_block = llvm_basic_block_new(c, "cond.phi"); + LLVMBasicBlockRef rhs_block = llvm_basic_block_new(c, "cond.rhs"); + llvm_emit_cond_br(c, value, phi_block, rhs_block); llvm_emit_block(c, rhs_block); BEValue rhs; @@ -4442,10 +4443,6 @@ void gencontext_emit_ternary_expr(GenContext *c, BEValue *value, Expr *expr) return; } - // Set up basic blocks, following Cone - LLVMBasicBlockRef phi_block = llvm_basic_block_new(c, "cond.phi"); - LLVMBasicBlockRef lhs_block = llvm_basic_block_new(c, "cond.lhs"); - LLVMBasicBlockRef rhs_block = llvm_basic_block_new(c, "cond.rhs"); bool is_elvis = false; @@ -4495,6 +4492,10 @@ void gencontext_emit_ternary_expr(GenContext *c, BEValue *value, Expr *expr) return; } + // Set up basic blocks, following Cone + LLVMBasicBlockRef phi_block = llvm_basic_block_new(c, "cond.phi"); + LLVMBasicBlockRef rhs_block = llvm_basic_block_new(c, "cond.rhs"); + LLVMBasicBlockRef lhs_exit; if (is_elvis) { @@ -4504,6 +4505,7 @@ void gencontext_emit_ternary_expr(GenContext *c, BEValue *value, Expr *expr) } else { + LLVMBasicBlockRef lhs_block = llvm_basic_block_new(c, "cond.lhs"); llvm_emit_cond_br(c, value, lhs_block, rhs_block); llvm_emit_block(c, lhs_block); BEValue lhs; diff --git a/src/compiler/llvm_codegen_function.c b/src/compiler/llvm_codegen_function.c index 8d5ba6ab0..eb0c8f628 100644 --- a/src/compiler/llvm_codegen_function.c +++ b/src/compiler/llvm_codegen_function.c @@ -604,6 +604,7 @@ void llvm_emit_body(GenContext *c, LLVMValueRef function, const char *module_nam if (llvm_use_debug(c)) { llvm_debug_scope_pop(c); + LLVMDIBuilderFinalizeSubprogram(c->debug.builder, c->debug.function); } c->builder = prev_builder; @@ -649,7 +650,7 @@ void llvm_emit_xxlizer(GenContext *c, Decl *decl) true, true, row, - LLVMDIFlagPrivate, + LLVMDIFlagZero, active_target.optimization_level != OPTIMIZATION_NONE); LLVMSetSubprogram(function, c->debug.function); } diff --git a/src/compiler/llvm_codegen_module.c b/src/compiler/llvm_codegen_module.c index fd60789de..5a9343ae2 100644 --- a/src/compiler/llvm_codegen_module.c +++ b/src/compiler/llvm_codegen_module.c @@ -153,6 +153,8 @@ void gencontext_begin_module(GenContext *c) 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, LLVMModuleFlagBehaviorError, "uwtable", 2, type_uint); + c->debug.runtime_version = 1; c->debug.builder = LLVMCreateDIBuilder(c->module); if (active_target.debug_info == DEBUG_INFO_FULL && active_target.feature.safe_mode) diff --git a/src/compiler/llvm_codegen_stmt.c b/src/compiler/llvm_codegen_stmt.c index ca3866324..73d31c9ed 100644 --- a/src/compiler/llvm_codegen_stmt.c +++ b/src/compiler/llvm_codegen_stmt.c @@ -546,16 +546,16 @@ void llvm_emit_for_stmt(GenContext *c, Ast *ast) // so emit the block llvm_emit_block(c, body_block); break; - case LOOP_INFINITE: - // In this case we have no cond, so we need to emit the br and - // then the block - llvm_emit_br(c, body_block); - llvm_emit_block(c, body_block); - case LOOP_NONE: - // If there is no loop, then we will just fall through and the - // block is needed. - body_block = NULL; - break; + case LOOP_INFINITE: + // In this case we have no cond, so we need to emit the br and + // then the block + llvm_emit_br(c, body_block); + llvm_emit_block(c, body_block); + case LOOP_NONE: + // If there is no loop, then we will just fall through and the + // block is needed. + body_block = NULL; + break; } // Now emit the body llvm_emit_stmt(c, body); diff --git a/src/utils/file_utils.c b/src/utils/file_utils.c index 651b62d06..6bf092e0d 100644 --- a/src/utils/file_utils.c +++ b/src/utils/file_utils.c @@ -372,15 +372,17 @@ const char *find_lib_dir(void) { path[strlen_path - 1] = '\0'; } - const char *lib_path; - if ((lib_path = lib_find(path, "/../lib/"))) return lib_path; - if ((lib_path = lib_find(path, "/lib/"))) return lib_path; - if ((lib_path = lib_find(path, "/"))) return lib_path; - if ((lib_path = lib_find(path, "/../"))) return lib_path; - if ((lib_path = lib_find(path, "/../../lib/"))) return lib_path; + const char *lib_path = NULL; + if ((lib_path = lib_find(path, "/../lib/"))) goto DONE; + if ((lib_path = lib_find(path, "/lib/"))) goto DONE; + if ((lib_path = lib_find(path, "/"))) goto DONE; + if ((lib_path = lib_find(path, "/../"))) goto DONE; + if ((lib_path = lib_find(path, "/../../lib/"))) goto DONE; DEBUG_LOG("Could not find the standard library /lib/std/"); - return NULL; +DONE:; + free(path); + return lib_path; } void file_get_dir_and_filename_from_full(const char *full_path, char **filename, char **dir_path) diff --git a/src/utils/lib.h b/src/utils/lib.h index 5c95882df..2f7136784 100644 --- a/src/utils/lib.h +++ b/src/utils/lib.h @@ -93,8 +93,23 @@ void memory_release(); #define idptr(id_) ((void*)(((uintptr_t)id_) * 16 + arena_zero)) void *calloc_arena(size_t mem); char *calloc_string(size_t len); +#ifdef NDEBUG #define malloc_string calloc_string #define malloc_arena calloc_arena +#else +static inline void *malloc_string(size_t len) +{ + void *data = calloc_string(len); + memset(data, 0xaa, len); + return data; +} +static inline void *malloc_arena(size_t len) +{ + void *data = calloc_arena(len); + memset(data, 0xaa, len); + return data; +} +#endif void free_arena(void); void print_arena_status(void); void run_arena_allocator_tests(void); diff --git a/test/test_suite/concurrency/atomic_load_store_debug.c3t b/test/test_suite/concurrency/atomic_load_store_debug.c3t new file mode 100644 index 000000000..9c1fcb2d6 --- /dev/null +++ b/test/test_suite/concurrency/atomic_load_store_debug.c3t @@ -0,0 +1,120 @@ +// #target: macos-x64 +// #debuginfo: yes +module test; +import std::io; + +struct Ghh +{ + int a; + int b; + int c; +} +fn void main() +{ + int a = 111; + int x = @atomic_load(a); + int y = @atomic_load(a, MONOTONIC, true); + @atomic_store(a, 123 + x); + @atomic_store(a, 33 + y, MONOTONIC, true); + io::printfn("%d", a); +} + +/* #expect: test.ll +source_filename = "test" +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-darwin" + +%.introspect = type { i8, ptr, i64, i64, i64, [0 x i64] } +%any = type { ptr, i64 } + +@"$ct.test.Ghh" = linkonce global %.introspect { i8 10, ptr null, i64 12, i64 0, i64 3, [0 x i64] zeroinitializer }, align 8 +@.str = private unnamed_addr constant [3 x i8] c"%d\00", align 1 +@"$ct.int" = linkonce global %.introspect { i8 2, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8 + +define void @test.main() #0 !dbg !5 { +entry: + %a = alloca i32, align 4 + %x = alloca i32, align 4 + %y = alloca i32, align 4 + %retparam = alloca i64, align 8 + %varargslots = alloca [1 x %any], align 16 + call void @llvm.dbg.declare(metadata ptr %a, metadata !9, metadata !DIExpression()), !dbg !11 + store i32 111, ptr %a, align 4, !dbg !12 + call void @llvm.dbg.declare(metadata ptr %x, metadata !13, metadata !DIExpression()), !dbg !14 + %0 = load atomic i32, ptr %a seq_cst, align 4, !dbg !15 + store i32 %0, ptr %x, align 4, !dbg !15 + call void @llvm.dbg.declare(metadata ptr %y, metadata !18, metadata !DIExpression()), !dbg !19 + %1 = load atomic volatile i32, ptr %a monotonic, align 4, !dbg !20 + store i32 %1, ptr %y, align 4, !dbg !20 + %2 = load i32, ptr %x, align 4, !dbg !22 + %add = add i32 123, %2, !dbg !23 + store atomic i32 %add, ptr %a seq_cst, align 4, !dbg !24 + %3 = load i32, ptr %y, align 4, !dbg !26 + %add1 = add i32 33, %3, !dbg !27 + store atomic volatile i32 %add1, ptr %a monotonic, align 4, !dbg !28 + %4 = insertvalue %any undef, ptr %a, 0, !dbg !30 + %5 = insertvalue %any %4, i64 ptrtoint (ptr @"$ct.int" to i64), 1, !dbg !30 + %6 = getelementptr inbounds [1 x %any], ptr %varargslots, i64 0, i64 0, !dbg !30 + store %any %5, ptr %6, align 16, !dbg !30 + %7 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 2, ptr %varargslots, i64 1), !dbg !31 + ret void, !dbg !31 +} + +define i32 @main(i32 %0, ptr %1) #0 !dbg !32 { +entry: + call void @test.main(), !dbg !38 + ret i32 0, !dbg !41 +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 + +; Function Attrs: nounwind +declare i64 @std.io.printfn(ptr, ptr, i64, ptr, i64) #0 + +declare i1 @llvm.expect.i1(i1, i1) #2 + +!llvm.module.flags = !{!0, !1, !2} +!llvm.dbg.cu = !{!3} + +!0 = !{i32 2, !"Dwarf Version", i32 4} +!1 = !{i32 2, !"Debug Info Version", i32 3} +!2 = !{i32 1, !"uwtable", i32 2} +!3 = distinct !DICompileUnit(language: DW_LANG_C11, file: !4, producer: "c3c", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false) +!4 = !DIFile(filename: "atomic_load_store_debug.c3", +!5 = distinct !DISubprogram(name: "main", linkageName: "test.main", scope: !4, file: !4, line: 10, type: !6, scopeLine: 10, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !3, retainedNodes: !8) +!6 = !DISubroutineType(types: !7) +!7 = !{null} +!8 = !{} +!9 = !DILocalVariable(name: "a", scope: !5, file: !4, line: 12, type: !10, align: 4) +!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!11 = !DILocation(line: 12, column: 6, scope: !5) +!12 = !DILocation(line: 12, column: 10, scope: !5) +!13 = !DILocalVariable(name: "x", scope: !5, file: !4, line: 13, type: !10, align: 4) +!14 = !DILocation(line: 13, column: 6, scope: !5) +!15 = !DILocation(line: 47, column: 23, scope: !16) +!16 = distinct !DILexicalBlock(scope: !5, file: !17, line: 47, column: 9) +!17 = !DIFile(filename: "mem.c3", +!18 = !DILocalVariable(name: "y", scope: !5, file: !4, line: 14, type: !10, align: 4) +!19 = !DILocation(line: 14, column: 6, scope: !5) +!20 = !DILocation(line: 47, column: 23, scope: !21) +!21 = distinct !DILexicalBlock(scope: !5, file: !17, line: 47, column: 9) +!22 = !DILocation(line: 15, column: 25, scope: !5) +!23 = !DILocation(line: 15, column: 19, scope: !5) +!24 = !DILocation(line: 62, column: 20, scope: !25) +!25 = distinct !DILexicalBlock(scope: !5, file: !17, line: 62, column: 2) +!26 = !DILocation(line: 16, column: 24, scope: !5) +!27 = !DILocation(line: 16, column: 19, scope: !5) +!28 = !DILocation(line: 62, column: 20, scope: !29) +!29 = distinct !DILexicalBlock(scope: !5, file: !17, line: 62, column: 2) +!30 = !DILocation(line: 17, column: 20, scope: !5) +!31 = !DILocation(line: 17, column: 6, scope: !5) +!32 = distinct !DISubprogram(name: "_$main", linkageName: "main", scope: !4, file: !4, line: 10, type: !33, scopeLine: 10, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !3, retainedNodes: !8) +!33 = !DISubroutineType(types: !34) +!34 = !{!10, !10, !35} +!35 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "char**", baseType: !36, size: 64, align: 64, dwarfAddressSpace: 0) +!36 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "char*", baseType: !37, size: 64, align: 64, dwarfAddressSpace: 0) +!37 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_unsigned_char) +!38 = !DILocation(line: 18, column: 2, scope: !39) +!39 = distinct !DILexicalBlock(scope: !32, file: !40, line: 18, column: 2) +!40 = !DIFile(filename: "main_stub.c3", +!41 = !DILocation(line: 19, column: 9, scope: !39) \ No newline at end of file diff --git a/test/test_suite/debug_symbols/constants.c3t b/test/test_suite/debug_symbols/constants.c3t index afd80f610..4b96c8a80 100644 --- a/test/test_suite/debug_symbols/constants.c3t +++ b/test/test_suite/debug_symbols/constants.c3t @@ -11,22 +11,21 @@ const FOO @private = ~(uint)(0); @constants.BB = local_unnamed_addr constant i8 -56, align 1 @constants.CC = protected unnamed_addr constant i32 -1, align 4 @constants.FOO = protected unnamed_addr constant i32 -1, align 4 - -!llvm.module.flags = !{!0, !1} -!llvm.dbg.cu = !{!2} - +!llvm.module.flags = !{!0, !1, !2} +!llvm.dbg.cu = !{!3} !0 = !{i32 2, !"Dwarf Version", i32 4} !1 = !{i32 2, !"Debug Info Version", i32 3} -!2 = distinct !DICompileUnit(language: DW_LANG_C11, file: !3, producer: "c3c", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false) -!3 = !DIFile(filename: "constants.c3", -!4 = !{!5, !8, !10, !13} -!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression()) -!6 = distinct !DIGlobalVariable(name: "AA", linkageName: "constants.AA", scope: !3 -!7 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_unsigned_char) -!8 = !DIGlobalVariableExpression(var: !9, expr: !DIExpression()) -!9 = distinct !DIGlobalVariable(name: "BB", linkageName: "constants.BB", scope: !3, file: !3, line: 2 -!10 = !DIGlobalVariableExpression(var: !11, expr: !DIExpression()) -!11 = distinct !DIGlobalVariable(name: "CC", linkageName: "constants.CC", scope: !3, file: !3, line: 3 -!12 = !DIBasicType(name: "uint", size: 32, encoding: DW_ATE_unsigned) -!13 = !DIGlobalVariableExpression(var: !14, expr: !DIExpression()) -!14 = distinct !DIGlobalVariable(name: "FOO", linkageName: "constants.FOO", scope: !3, file: !3, line: +!2 = !{i32 1, !"uwtable", i32 2} +!3 = distinct !DICompileUnit(language: DW_LANG_C11, file: !4, producer: "c3c", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !5, splitDebugInlining: false) +!4 = !DIFile(filename: "constants.c3", +!5 = !{!6, !9, !11, !14} +!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression()) +!7 = distinct !DIGlobalVariable(name: "AA", linkageName: "constants.AA", scope: !4 +!8 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_unsigned_char) +!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression()) +!10 = distinct !DIGlobalVariable(name: "BB", linkageName: "constants.BB", scope: !4, file: !4, line: 2 +!11 = !DIGlobalVariableExpression(var: !12, expr: !DIExpression()) +!12 = distinct !DIGlobalVariable(name: "CC", linkageName: "constants.CC", scope: !4, file: !4, line: 3 +!13 = !DIBasicType(name: "uint", size: 32, encoding: DW_ATE_unsigned) +!14 = !DIGlobalVariableExpression(var: !15, expr: !DIExpression()) +!15 = distinct !DIGlobalVariable(name: "FOO", linkageName: "constants.FOO", scope: !4, file: !4, line: diff --git a/test/test_suite/debug_symbols/constants_mingw.c3t b/test/test_suite/debug_symbols/constants_mingw.c3t new file mode 100644 index 000000000..921711465 --- /dev/null +++ b/test/test_suite/debug_symbols/constants_mingw.c3t @@ -0,0 +1,38 @@ +// #target: mingw-x64 +// #debuginfo: yes +const char AA @private = 1; +const char BB = 200 ; +const uint CC @private = ~(uint)(0); +const FOO @private = ~(uint)(0); + +/* #expect: constants_mingw.ll + +; ModuleID = 'constants_mingw' + +source_filename = "constants_mingw" +target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-w64-windows-gnu" + +@constants_mingw.AA = protected unnamed_addr constant i8 1, align 1 +@constants_mingw.BB = local_unnamed_addr constant i8 -56, align 1 +@constants_mingw.CC = protected unnamed_addr constant i32 -1, align 4 +@constants_mingw.FOO = protected unnamed_addr constant i32 -1, align 4 + +!llvm.module.flags = !{!0, !1, !2} +!llvm.dbg.cu = !{!3} + +!0 = !{i32 2, !"Dwarf Version", i32 4} +!1 = !{i32 2, !"Debug Info Version", i32 3} +!2 = !{i32 1, !"uwtable", i32 2} +!3 = distinct !DICompileUnit(language: DW_LANG_C11, file: !4, producer: "c3c", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !5, splitDebugInlining: false) +!5 = !{!6, !9, !11, !14} +!6 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression()) +!7 = distinct !DIGlobalVariable(name: "AA", linkageName: "constants_mingw.AA", scope: !4, file: !4, line: 1, type: !8, isLocal: true, isDefinition: true, align: 1) +!8 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_unsigned_char) +!9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression()) +!10 = distinct !DIGlobalVariable(name: "BB", linkageName: "constants_mingw.BB", scope: !4, file: !4, line: 2, type: !8, isLocal: false, isDefinition: true, align: 1) +!11 = !DIGlobalVariableExpression(var: !12, expr: !DIExpression()) +!12 = distinct !DIGlobalVariable(name: "CC", linkageName: "constants_mingw.CC", scope: !4, file: !4, line: 3, type: !13, isLocal: true, isDefinition: true, align: 4) +!13 = !DIBasicType(name: "uint", size: 32, encoding: DW_ATE_unsigned) +!14 = !DIGlobalVariableExpression(var: !15, expr: !DIExpression()) +!15 = distinct !DIGlobalVariable(name: "FOO", linkageName: "constants_mingw.FOO", scope: !4, file: !4, line: 4, type: !13, isLocal: true, isDefinition: true, align: 4)