Commit 80cd142c96

LemonBoy <thatlemon@gmail.com>
2019-06-04 09:05:33
Propagate DIFlags to LLVM
1 parent ebe921e
src/analyze.cpp
@@ -6388,12 +6388,14 @@ static void resolve_llvm_types_slice(CodeGen *g, ZigType *type, ResolveStatus wa
                     len_debug_size_in_bits,
                     len_debug_align_in_bits,
                     len_offset_in_bits,
-                    0, usize_llvm_di_type),
+                    ZigLLVM_DIFlags_Zero,
+                    usize_llvm_di_type),
         };
         ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder,
                 compile_unit_scope,
                 buf_ptr(&type->name),
-                di_file, line, debug_size_in_bits, debug_align_in_bits, 0,
+                di_file, line, debug_size_in_bits, debug_align_in_bits,
+                ZigLLVM_DIFlags_Zero,
                 nullptr, di_element_types, 1, 0, nullptr, "");
 
         ZigLLVMReplaceTemporary(g->dbuilder, type->llvm_di_type, replacement_di_type);
@@ -6425,18 +6427,19 @@ static void resolve_llvm_types_slice(CodeGen *g, ZigType *type, ResolveStatus wa
                 ptr_debug_size_in_bits,
                 ptr_debug_align_in_bits,
                 ptr_offset_in_bits,
-                0, get_llvm_di_type(g, ptr_type)),
+                ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, ptr_type)),
         ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(type->llvm_di_type),
                 "len", di_file, line,
                 len_debug_size_in_bits,
                 len_debug_align_in_bits,
                 len_offset_in_bits,
-                0, usize_llvm_di_type),
+                ZigLLVM_DIFlags_Zero, usize_llvm_di_type),
     };
     ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder,
             compile_unit_scope,
             buf_ptr(&type->name),
-            di_file, line, debug_size_in_bits, debug_align_in_bits, 0,
+            di_file, line, debug_size_in_bits, debug_align_in_bits,
+            ZigLLVM_DIFlags_Zero,
             nullptr, di_element_types, 2, 0, nullptr, "");
 
     ZigLLVMReplaceTemporary(g->dbuilder, type->llvm_di_type, replacement_di_type);
@@ -6597,7 +6600,7 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS
                 debug_size_in_bits,
                 debug_align_in_bits,
                 debug_offset_in_bits,
-                0, field_di_type);
+                ZigLLVM_DIFlags_Zero, field_di_type);
         assert(di_element_types[debug_field_index]);
         debug_field_index += 1;
     }
@@ -6610,7 +6613,8 @@ static void resolve_llvm_types_struct(CodeGen *g, ZigType *struct_type, ResolveS
             di_file, line,
             debug_size_in_bits,
             debug_align_in_bits,
-            0, nullptr, di_element_types, (int)debug_field_count, 0, nullptr, "");
+            ZigLLVM_DIFlags_Zero,
+            nullptr, di_element_types, (int)debug_field_count, 0, nullptr, "");
 
     ZigLLVMReplaceTemporary(g->dbuilder, struct_type->llvm_di_type, replacement_di_type);
     struct_type->llvm_di_type = replacement_di_type;
@@ -6639,7 +6643,8 @@ static void resolve_llvm_types_enum(CodeGen *g, ZigType *enum_type) {
                 import->data.structure.root_struct->di_file, (unsigned)(decl_node->line + 1),
                 debug_size_in_bits,
                 debug_align_in_bits,
-                0, nullptr, di_element_types, (int)debug_field_count, 0, nullptr, "");
+                ZigLLVM_DIFlags_Zero,
+                nullptr, di_element_types, (int)debug_field_count, 0, nullptr, "");
         return;
     }
 
@@ -6723,7 +6728,7 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
                 store_size_in_bits,
                 abi_align_in_bits,
                 0,
-                0, field_di_type);
+                ZigLLVM_DIFlags_Zero, field_di_type);
 
     }
 
@@ -6752,7 +6757,7 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
             import->data.structure.root_struct->di_file, (unsigned)(decl_node->line + 1),
             union_type->data.unionation.union_abi_size * 8,
             most_aligned_union_member->abi_align * 8,
-            0, union_inner_di_types,
+            ZigLLVM_DIFlags_Zero, union_inner_di_types,
             gen_field_count, 0, "");
 
         ZigLLVMReplaceTemporary(g->dbuilder, union_type->llvm_di_type, replacement_di_type);
@@ -6786,7 +6791,7 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
             ZigLLVMTypeToScope(union_type->llvm_di_type), "AnonUnion",
             import->data.structure.root_struct->di_file, (unsigned)(decl_node->line + 1),
             most_aligned_union_member->size_in_bits, 8*most_aligned_union_member->abi_align,
-            0, union_inner_di_types, gen_field_count, 0, "");
+            ZigLLVM_DIFlags_Zero, union_inner_di_types, gen_field_count, 0, "");
 
     uint64_t union_offset_in_bits = 8*LLVMOffsetOfElement(g->target_data_ref, union_type->llvm_type,
             union_type->data.unionation.gen_union_index);
@@ -6799,7 +6804,7 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
             most_aligned_union_member->size_in_bits,
             8*most_aligned_union_member->abi_align,
             union_offset_in_bits,
-            0, union_di_type);
+            ZigLLVM_DIFlags_Zero, union_di_type);
 
     uint64_t tag_debug_size_in_bits = tag_type->size_in_bits;
     uint64_t tag_debug_align_in_bits = 8*tag_type->abi_align;
@@ -6810,7 +6815,7 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
             tag_debug_size_in_bits,
             tag_debug_align_in_bits,
             tag_offset_in_bits,
-            0, get_llvm_di_type(g, tag_type));
+            ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, tag_type));
 
     ZigLLVMDIType *di_root_members[2];
     di_root_members[union_type->data.unionation.gen_tag_index] = tag_member_di_type;
@@ -6824,7 +6829,7 @@ static void resolve_llvm_types_union(CodeGen *g, ZigType *union_type, ResolveSta
             import->data.structure.root_struct->di_file, (unsigned)(decl_node->line + 1),
             debug_size_in_bits,
             debug_align_in_bits,
-            0, nullptr, di_root_members, 2, 0, nullptr, "");
+            ZigLLVM_DIFlags_Zero, nullptr, di_root_members, 2, 0, nullptr, "");
 
     ZigLLVMReplaceTemporary(g->dbuilder, union_type->llvm_di_type, replacement_di_type);
     union_type->llvm_di_type = replacement_di_type;
@@ -6952,18 +6957,18 @@ static void resolve_llvm_types_optional(CodeGen *g, ZigType *type) {
                 val_debug_size_in_bits,
                 val_debug_align_in_bits,
                 val_offset_in_bits,
-                0, child_llvm_di_type),
+                ZigLLVM_DIFlags_Zero, child_llvm_di_type),
         ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(type->llvm_di_type),
                 "maybe", di_file, line,
                 maybe_debug_size_in_bits,
                 maybe_debug_align_in_bits,
                 maybe_offset_in_bits,
-                0, bool_llvm_di_type),
+                ZigLLVM_DIFlags_Zero, bool_llvm_di_type),
     };
     ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder,
             compile_unit_scope,
             buf_ptr(&type->name),
-            di_file, line, debug_size_in_bits, debug_align_in_bits, 0,
+            di_file, line, debug_size_in_bits, debug_align_in_bits, ZigLLVM_DIFlags_Zero,
             nullptr, di_element_types, 2, 0, nullptr, "");
 
     ZigLLVMReplaceTemporary(g->dbuilder, type->llvm_di_type, replacement_di_type);
@@ -7016,13 +7021,13 @@ static void resolve_llvm_types_error_union(CodeGen *g, ZigType *type) {
                     tag_debug_size_in_bits,
                     tag_debug_align_in_bits,
                     tag_offset_in_bits,
-                    0, get_llvm_di_type(g, err_set_type)),
+                    ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, err_set_type)),
             ZigLLVMCreateDebugMemberType(g->dbuilder, ZigLLVMTypeToScope(type->llvm_di_type),
                     "value", di_file, line,
                     value_debug_size_in_bits,
                     value_debug_align_in_bits,
                     value_offset_in_bits,
-                    0, get_llvm_di_type(g, payload_type)),
+                    ZigLLVM_DIFlags_Zero, get_llvm_di_type(g, payload_type)),
         };
 
         ZigLLVMDIType *replacement_di_type = ZigLLVMCreateDebugStructType(g->dbuilder,
@@ -7031,7 +7036,7 @@ static void resolve_llvm_types_error_union(CodeGen *g, ZigType *type) {
                 di_file, line,
                 debug_size_in_bits,
                 debug_align_in_bits,
-                0,
+                ZigLLVM_DIFlags_Zero,
                 nullptr, di_element_types, 2, 0, nullptr, "");
 
         ZigLLVMReplaceTemporary(g->dbuilder, type->llvm_di_type, replacement_di_type);
src/codegen.cpp
@@ -674,7 +674,7 @@ static ZigLLVMDIScope *get_di_scope(CodeGen *g, Scope *scope) {
             bool is_optimized = g->build_mode != BuildModeDebug;
             bool is_internal_linkage = (fn_table_entry->body_node != nullptr &&
                     fn_table_entry->export_list.length == 0);
-            unsigned flags = 0;
+            unsigned flags = ZigLLVM_DIFlags_StaticMember;
             ZigLLVMDIScope *fn_di_scope = get_di_scope(g, scope->parent);
             assert(fn_di_scope != nullptr);
             ZigLLVMDISubprogram *subprogram = ZigLLVMCreateFunction(g->dbuilder,
src/zig_llvm.cpp
@@ -318,12 +318,12 @@ ZigLLVMDIType *ZigLLVMCreateDebugMemberType(ZigLLVMDIBuilder *dibuilder, ZigLLVM
         const char *name, ZigLLVMDIFile *file, unsigned line, uint64_t size_in_bits,
         uint64_t align_in_bits, uint64_t offset_in_bits, unsigned flags, ZigLLVMDIType *type)
 {
-    assert(flags == 0);
     DIType *di_type = reinterpret_cast<DIBuilder*>(dibuilder)->createMemberType(
             reinterpret_cast<DIScope*>(scope),
             name,
             reinterpret_cast<DIFile*>(file),
-            line, size_in_bits, align_in_bits, offset_in_bits, DINode::FlagZero,
+            line, size_in_bits, align_in_bits, offset_in_bits,
+            static_cast<DINode::DIFlags>(flags),
             reinterpret_cast<DIType*>(type));
     return reinterpret_cast<ZigLLVMDIType*>(di_type);
 }
@@ -338,12 +338,12 @@ ZigLLVMDIType *ZigLLVMCreateDebugUnionType(ZigLLVMDIBuilder *dibuilder, ZigLLVMD
         DIType *ditype = reinterpret_cast<DIType*>(types_array[i]);
         fields.push_back(ditype);
     }
-    assert(flags == 0);
     DIType *di_type = reinterpret_cast<DIBuilder*>(dibuilder)->createUnionType(
             reinterpret_cast<DIScope*>(scope),
             name,
             reinterpret_cast<DIFile*>(file),
-            line_number, size_in_bits, align_in_bits, DINode::FlagZero,
+            line_number, size_in_bits, align_in_bits,
+            static_cast<DINode::DIFlags>(flags),
             reinterpret_cast<DIBuilder*>(dibuilder)->getOrCreateArray(fields),
             run_time_lang, unique_id);
     return reinterpret_cast<ZigLLVMDIType*>(di_type);
@@ -360,12 +360,12 @@ ZigLLVMDIType *ZigLLVMCreateDebugStructType(ZigLLVMDIBuilder *dibuilder, ZigLLVM
         DIType *ditype = reinterpret_cast<DIType*>(types_array[i]);
         fields.push_back(ditype);
     }
-    assert(flags == 0);
     DIType *di_type = reinterpret_cast<DIBuilder*>(dibuilder)->createStructType(
             reinterpret_cast<DIScope*>(scope),
             name,
             reinterpret_cast<DIFile*>(file),
-            line_number, size_in_bits, align_in_bits, DINode::FlagZero,
+            line_number, size_in_bits, align_in_bits,
+            static_cast<DINode::DIFlags>(flags),
             reinterpret_cast<DIType*>(derived_from),
             reinterpret_cast<DIBuilder*>(dibuilder)->getOrCreateArray(fields),
             run_time_lang,
@@ -426,11 +426,10 @@ ZigLLVMDIType *ZigLLVMCreateSubroutineType(ZigLLVMDIBuilder *dibuilder_wrapped,
         DIType *ditype = reinterpret_cast<DIType*>(types_array[i]);
         types.push_back(ditype);
     }
-    assert(flags == 0);
     DIBuilder *dibuilder = reinterpret_cast<DIBuilder*>(dibuilder_wrapped);
     DISubroutineType *subroutine_type = dibuilder->createSubroutineType(
             dibuilder->getOrCreateTypeArray(types),
-            DINode::FlagZero);
+            static_cast<DINode::DIFlags>(flags));
     DIType *ditype = subroutine_type;
     return reinterpret_cast<ZigLLVMDIType*>(ditype);
 }
@@ -516,7 +515,6 @@ ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(ZigLLVMDIBuilder *dbuilder,
         ZigLLVMDIScope *scope, const char *name, ZigLLVMDIFile *file, unsigned line_no,
         ZigLLVMDIType *type, bool always_preserve, unsigned flags)
 {
-    assert(flags == 0);
     DILocalVariable *result = reinterpret_cast<DIBuilder*>(dbuilder)->createAutoVariable(
             reinterpret_cast<DIScope*>(scope),
             name,
@@ -524,7 +522,7 @@ ZigLLVMDILocalVariable *ZigLLVMCreateAutoVariable(ZigLLVMDIBuilder *dbuilder,
             line_no,
             reinterpret_cast<DIType*>(type),
             always_preserve,
-            DINode::FlagZero);
+            static_cast<DINode::DIFlags>(flags));
     return reinterpret_cast<ZigLLVMDILocalVariable*>(result);
 }
 
@@ -547,7 +545,6 @@ ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilde
         ZigLLVMDIScope *scope, const char *name, ZigLLVMDIFile *file, unsigned line_no,
         ZigLLVMDIType *type, bool always_preserve, unsigned flags, unsigned arg_no)
 {
-    assert(flags == 0);
     assert(arg_no != 0);
     DILocalVariable *result = reinterpret_cast<DIBuilder*>(dbuilder)->createParameterVariable(
             reinterpret_cast<DIScope*>(scope),
@@ -557,7 +554,7 @@ ZigLLVMDILocalVariable *ZigLLVMCreateParameterVariable(ZigLLVMDIBuilder *dbuilde
             line_no,
             reinterpret_cast<DIType*>(type),
             always_preserve,
-            DINode::FlagZero);
+            static_cast<DINode::DIFlags>(flags));
     return reinterpret_cast<ZigLLVMDILocalVariable*>(result);
 }
 
@@ -612,7 +609,6 @@ ZigLLVMDISubprogram *ZigLLVMCreateFunction(ZigLLVMDIBuilder *dibuilder, ZigLLVMD
         unsigned flags, bool is_optimized, ZigLLVMDISubprogram *decl_subprogram)
 {
     DISubroutineType *di_sub_type = static_cast<DISubroutineType*>(reinterpret_cast<DIType*>(fn_di_type));
-    assert(flags == 0);
     DISubprogram *result = reinterpret_cast<DIBuilder*>(dibuilder)->createFunction(
             reinterpret_cast<DIScope*>(scope),
             name, linkage_name,
@@ -620,7 +616,7 @@ ZigLLVMDISubprogram *ZigLLVMCreateFunction(ZigLLVMDIBuilder *dibuilder, ZigLLVMD
             lineno,
             di_sub_type,
             scope_line,
-            DINode::FlagStaticMember,
+            static_cast<DINode::DIFlags>(flags),
             DISubprogram::toSPFlags(is_local_to_unit, is_definition, is_optimized),
             nullptr,
             reinterpret_cast<DISubprogram *>(decl_subprogram),
src/zig_llvm.h
@@ -406,6 +406,39 @@ enum ZigLLVM_ObjectFormatType {
     ZigLLVM_Wasm,
 };
 
+#define ZigLLVM_DIFlags_Zero 0U
+#define ZigLLVM_DIFlags_Private 1U
+#define ZigLLVM_DIFlags_Protected 2U
+#define ZigLLVM_DIFlags_Public 3U
+#define ZigLLVM_DIFlags_FwdDecl (1U << 2)
+#define ZigLLVM_DIFlags_AppleBlock (1U << 3)
+#define ZigLLVM_DIFlags_BlockByrefStruct (1U << 4)
+#define ZigLLVM_DIFlags_Virtual (1U << 5)
+#define ZigLLVM_DIFlags_Artificial (1U << 6)
+#define ZigLLVM_DIFlags_Explicit (1U << 7)
+#define ZigLLVM_DIFlags_Prototyped (1U << 8)
+#define ZigLLVM_DIFlags_ObjcClassComplete (1U << 9)
+#define ZigLLVM_DIFlags_ObjectPointer (1U << 10)
+#define ZigLLVM_DIFlags_Vector (1U << 11)
+#define ZigLLVM_DIFlags_StaticMember (1U << 12)
+#define ZigLLVM_DIFlags_LValueReference (1U << 13)
+#define ZigLLVM_DIFlags_RValueReference (1U << 14)
+#define ZigLLVM_DIFlags_Reserved (1U << 15)
+#define ZigLLVM_DIFlags_SingleInheritance (1U << 16)
+#define ZigLLVM_DIFlags_MultipleInheritance (2 << 16)
+#define ZigLLVM_DIFlags_VirtualInheritance (3 << 16)
+#define ZigLLVM_DIFlags_IntroducedVirtual (1U << 18)
+#define ZigLLVM_DIFlags_BitField (1U << 19)
+#define ZigLLVM_DIFlags_NoReturn (1U << 20)
+#define ZigLLVM_DIFlags_TypePassByValue (1U << 22)
+#define ZigLLVM_DIFlags_TypePassByReference (1U << 23)
+#define ZigLLVM_DIFlags_EnumClass (1U << 24)
+#define ZigLLVM_DIFlags_Thunk (1U << 25)
+#define ZigLLVM_DIFlags_NonTrivial (1U << 26)
+#define ZigLLVM_DIFlags_BigEndian (1U << 27)
+#define ZigLLVM_DIFlags_LittleEndian (1U << 28)
+#define ZigLLVM_DIFlags_AllCallsDescribed (1U << 29)
+
 ZIG_EXTERN_C const char *ZigLLVMGetArchTypeName(enum ZigLLVM_ArchType arch);
 ZIG_EXTERN_C const char *ZigLLVMGetSubArchTypeName(enum ZigLLVM_SubArchType sub_arch);
 ZIG_EXTERN_C const char *ZigLLVMGetVendorTypeName(enum ZigLLVM_VendorType vendor);