llvm_backend_debug.cpp 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195
  1. LLVMMetadataRef lb_get_llvm_metadata(lbModule *m, void *key) {
  2. if (key == nullptr) {
  3. return nullptr;
  4. }
  5. auto found = map_get(&m->debug_values, key);
  6. if (found) {
  7. return *found;
  8. }
  9. return nullptr;
  10. }
  11. void lb_set_llvm_metadata(lbModule *m, void *key, LLVMMetadataRef value) {
  12. if (key != nullptr) {
  13. map_set(&m->debug_values, key, value);
  14. }
  15. }
  16. LLVMMetadataRef lb_get_llvm_file_metadata_from_node(lbModule *m, Ast *node) {
  17. if (node == nullptr) {
  18. return nullptr;
  19. }
  20. return lb_get_llvm_metadata(m, node->file());
  21. }
  22. LLVMMetadataRef lb_get_current_debug_scope(lbProcedure *p) {
  23. GB_ASSERT_MSG(p->debug_info != nullptr, "missing debug information for %.*s", LIT(p->name));
  24. for (isize i = p->scope_stack.count-1; i >= 0; i--) {
  25. Scope *s = p->scope_stack[i];
  26. LLVMMetadataRef md = lb_get_llvm_metadata(p->module, s);
  27. if (md) {
  28. return md;
  29. }
  30. }
  31. return p->debug_info;
  32. }
  33. LLVMMetadataRef lb_debug_location_from_token_pos(lbProcedure *p, TokenPos pos) {
  34. LLVMMetadataRef scope = lb_get_current_debug_scope(p);
  35. GB_ASSERT_MSG(scope != nullptr, "%.*s", LIT(p->name));
  36. return LLVMDIBuilderCreateDebugLocation(p->module->ctx, cast(unsigned)pos.line, cast(unsigned)pos.column, scope, nullptr);
  37. }
  38. LLVMMetadataRef lb_debug_location_from_ast(lbProcedure *p, Ast *node) {
  39. GB_ASSERT(node != nullptr);
  40. return lb_debug_location_from_token_pos(p, ast_token(node).pos);
  41. }
  42. LLVMMetadataRef lb_debug_end_location_from_ast(lbProcedure *p, Ast *node) {
  43. GB_ASSERT(node != nullptr);
  44. return lb_debug_location_from_token_pos(p, ast_end_token(node).pos);
  45. }
  46. LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type) {
  47. i64 size = type_size_of(type); // Check size
  48. gb_unused(size);
  49. GB_ASSERT(type != t_invalid);
  50. /* unsigned const word_size = cast(unsigned)build_context.word_size;
  51. unsigned const word_bits = cast(unsigned)(8*build_context.word_size); */
  52. GB_ASSERT(type->kind == Type_Proc);
  53. unsigned parameter_count = 1;
  54. for (i32 i = 0; i < type->Proc.param_count; i++) {
  55. Entity *e = type->Proc.params->Tuple.variables[i];
  56. if (e->kind == Entity_Variable) {
  57. parameter_count += 1;
  58. }
  59. }
  60. LLVMMetadataRef *parameters = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, parameter_count);
  61. unsigned param_index = 0;
  62. if (type->Proc.result_count == 0) {
  63. parameters[param_index++] = nullptr;
  64. } else {
  65. parameters[param_index++] = lb_debug_type(m, type->Proc.results);
  66. }
  67. LLVMMetadataRef file = nullptr;
  68. for (i32 i = 0; i < type->Proc.param_count; i++) {
  69. Entity *e = type->Proc.params->Tuple.variables[i];
  70. if (e->kind != Entity_Variable) {
  71. continue;
  72. }
  73. parameters[param_index] = lb_debug_type(m, e->type);
  74. param_index += 1;
  75. }
  76. LLVMDIFlags flags = LLVMDIFlagZero;
  77. if (type->Proc.diverging) {
  78. flags = LLVMDIFlagNoReturn;
  79. }
  80. return LLVMDIBuilderCreateSubroutineType(m->debug_builder, file, parameters, parameter_count, flags);
  81. }
  82. LLVMMetadataRef lb_debug_struct_field(lbModule *m, String const &name, Type *type, u64 offset_in_bits) {
  83. unsigned field_line = 1;
  84. LLVMDIFlags field_flags = LLVMDIFlagZero;
  85. AstPackage *pkg = m->info->runtime_package;
  86. GB_ASSERT(pkg->files.count != 0);
  87. LLVMMetadataRef file = lb_get_llvm_metadata(m, pkg->files[0]);
  88. LLVMMetadataRef scope = file;
  89. return LLVMDIBuilderCreateMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, field_line,
  90. 8*cast(u64)type_size_of(type), 8*cast(u32)type_align_of(type), offset_in_bits,
  91. field_flags, lb_debug_type(m, type)
  92. );
  93. }
  94. LLVMMetadataRef lb_debug_basic_struct(lbModule *m, String const &name, u64 size_in_bits, u32 align_in_bits, LLVMMetadataRef *elements, unsigned element_count) {
  95. AstPackage *pkg = m->info->runtime_package;
  96. GB_ASSERT(pkg->files.count != 0);
  97. LLVMMetadataRef file = lb_get_llvm_metadata(m, pkg->files[0]);
  98. LLVMMetadataRef scope = file;
  99. return LLVMDIBuilderCreateStructType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, 1, size_in_bits, align_in_bits, LLVMDIFlagZero, nullptr, elements, element_count, 0, nullptr, "", 0);
  100. }
  101. LLVMMetadataRef lb_debug_type_basic_type(lbModule *m, String const &name, u64 size_in_bits, LLVMDWARFTypeEncoding encoding, LLVMDIFlags flags = LLVMDIFlagZero) {
  102. LLVMMetadataRef basic_type = LLVMDIBuilderCreateBasicType(m->debug_builder, cast(char const *)name.text, name.len, size_in_bits, encoding, flags);
  103. #if 1
  104. LLVMMetadataRef final_decl = LLVMDIBuilderCreateTypedef(m->debug_builder, basic_type, cast(char const *)name.text, name.len, nullptr, 0, nullptr, cast(u32)size_in_bits);
  105. return final_decl;
  106. #else
  107. return basic_type;
  108. #endif
  109. }
  110. LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
  111. i64 size = type_size_of(type); // Check size
  112. gb_unused(size);
  113. GB_ASSERT(type != t_invalid);
  114. /* unsigned const word_size = cast(unsigned)build_context.word_size; */
  115. unsigned const word_bits = cast(unsigned)(8*build_context.word_size);
  116. switch (type->kind) {
  117. case Type_Basic:
  118. switch (type->Basic.kind) {
  119. case Basic_llvm_bool: return lb_debug_type_basic_type(m, str_lit("llvm bool"), 1, LLVMDWARFTypeEncoding_Boolean);
  120. case Basic_bool: return lb_debug_type_basic_type(m, str_lit("bool"), 8, LLVMDWARFTypeEncoding_Boolean);
  121. case Basic_b8: return lb_debug_type_basic_type(m, str_lit("b8"), 8, LLVMDWARFTypeEncoding_Boolean);
  122. case Basic_b16: return lb_debug_type_basic_type(m, str_lit("b16"), 16, LLVMDWARFTypeEncoding_Boolean);
  123. case Basic_b32: return lb_debug_type_basic_type(m, str_lit("b32"), 32, LLVMDWARFTypeEncoding_Boolean);
  124. case Basic_b64: return lb_debug_type_basic_type(m, str_lit("b64"), 64, LLVMDWARFTypeEncoding_Boolean);
  125. case Basic_i8: return lb_debug_type_basic_type(m, str_lit("i8"), 8, LLVMDWARFTypeEncoding_Signed);
  126. case Basic_u8: return lb_debug_type_basic_type(m, str_lit("u8"), 8, LLVMDWARFTypeEncoding_Unsigned);
  127. case Basic_i16: return lb_debug_type_basic_type(m, str_lit("i16"), 16, LLVMDWARFTypeEncoding_Signed);
  128. case Basic_u16: return lb_debug_type_basic_type(m, str_lit("u16"), 16, LLVMDWARFTypeEncoding_Unsigned);
  129. case Basic_i32: return lb_debug_type_basic_type(m, str_lit("i32"), 32, LLVMDWARFTypeEncoding_Signed);
  130. case Basic_u32: return lb_debug_type_basic_type(m, str_lit("u32"), 32, LLVMDWARFTypeEncoding_Unsigned);
  131. case Basic_i64: return lb_debug_type_basic_type(m, str_lit("i64"), 64, LLVMDWARFTypeEncoding_Signed);
  132. case Basic_u64: return lb_debug_type_basic_type(m, str_lit("u64"), 64, LLVMDWARFTypeEncoding_Unsigned);
  133. case Basic_i128: return lb_debug_type_basic_type(m, str_lit("i128"), 128, LLVMDWARFTypeEncoding_Signed);
  134. case Basic_u128: return lb_debug_type_basic_type(m, str_lit("u128"), 128, LLVMDWARFTypeEncoding_Unsigned);
  135. case Basic_rune: return lb_debug_type_basic_type(m, str_lit("rune"), 32, LLVMDWARFTypeEncoding_Utf);
  136. case Basic_f16: return lb_debug_type_basic_type(m, str_lit("f16"), 16, LLVMDWARFTypeEncoding_Float);
  137. case Basic_f32: return lb_debug_type_basic_type(m, str_lit("f32"), 32, LLVMDWARFTypeEncoding_Float);
  138. case Basic_f64: return lb_debug_type_basic_type(m, str_lit("f64"), 64, LLVMDWARFTypeEncoding_Float);
  139. case Basic_int: return lb_debug_type_basic_type(m, str_lit("int"), word_bits, LLVMDWARFTypeEncoding_Signed);
  140. case Basic_uint: return lb_debug_type_basic_type(m, str_lit("uint"), word_bits, LLVMDWARFTypeEncoding_Unsigned);
  141. case Basic_uintptr: return lb_debug_type_basic_type(m, str_lit("uintptr"), word_bits, LLVMDWARFTypeEncoding_Unsigned);
  142. case Basic_typeid:
  143. return lb_debug_type_basic_type(m, str_lit("typeid"), word_bits, LLVMDWARFTypeEncoding_Unsigned);
  144. // Endian Specific Types
  145. case Basic_i16le: return lb_debug_type_basic_type(m, str_lit("i16le"), 16, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  146. case Basic_u16le: return lb_debug_type_basic_type(m, str_lit("u16le"), 16, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  147. case Basic_i32le: return lb_debug_type_basic_type(m, str_lit("i32le"), 32, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  148. case Basic_u32le: return lb_debug_type_basic_type(m, str_lit("u32le"), 32, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  149. case Basic_i64le: return lb_debug_type_basic_type(m, str_lit("i64le"), 64, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  150. case Basic_u64le: return lb_debug_type_basic_type(m, str_lit("u64le"), 64, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  151. case Basic_i128le: return lb_debug_type_basic_type(m, str_lit("i128le"), 128, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  152. case Basic_u128le: return lb_debug_type_basic_type(m, str_lit("u128le"), 128, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  153. case Basic_f16le: return lb_debug_type_basic_type(m, str_lit("f16le"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  154. case Basic_f32le: return lb_debug_type_basic_type(m, str_lit("f32le"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  155. case Basic_f64le: return lb_debug_type_basic_type(m, str_lit("f64le"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  156. case Basic_i16be: return lb_debug_type_basic_type(m, str_lit("i16be"), 16, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  157. case Basic_u16be: return lb_debug_type_basic_type(m, str_lit("u16be"), 16, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  158. case Basic_i32be: return lb_debug_type_basic_type(m, str_lit("i32be"), 32, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  159. case Basic_u32be: return lb_debug_type_basic_type(m, str_lit("u32be"), 32, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  160. case Basic_i64be: return lb_debug_type_basic_type(m, str_lit("i64be"), 64, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  161. case Basic_u64be: return lb_debug_type_basic_type(m, str_lit("u64be"), 64, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  162. case Basic_i128be: return lb_debug_type_basic_type(m, str_lit("i128be"), 128, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  163. case Basic_u128be: return lb_debug_type_basic_type(m, str_lit("u128be"), 128, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  164. case Basic_f16be: return lb_debug_type_basic_type(m, str_lit("f16be"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  165. case Basic_f32be: return lb_debug_type_basic_type(m, str_lit("f32be"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  166. case Basic_f64be: return lb_debug_type_basic_type(m, str_lit("f64be"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  167. case Basic_complex32:
  168. {
  169. LLVMMetadataRef elements[2] = {};
  170. elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f16, 0);
  171. elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f16, 4);
  172. return lb_debug_basic_struct(m, str_lit("complex32"), 64, 32, elements, gb_count_of(elements));
  173. }
  174. case Basic_complex64:
  175. {
  176. LLVMMetadataRef elements[2] = {};
  177. elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f32, 0);
  178. elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 4);
  179. return lb_debug_basic_struct(m, str_lit("complex64"), 64, 32, elements, gb_count_of(elements));
  180. }
  181. case Basic_complex128:
  182. {
  183. LLVMMetadataRef elements[2] = {};
  184. elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f64, 0);
  185. elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f64, 8);
  186. return lb_debug_basic_struct(m, str_lit("complex128"), 128, 64, elements, gb_count_of(elements));
  187. }
  188. case Basic_quaternion64:
  189. {
  190. LLVMMetadataRef elements[4] = {};
  191. elements[0] = lb_debug_struct_field(m, str_lit("imag"), t_f16, 0);
  192. elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f16, 4);
  193. elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f16, 8);
  194. elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f16, 12);
  195. return lb_debug_basic_struct(m, str_lit("quaternion64"), 128, 32, elements, gb_count_of(elements));
  196. }
  197. case Basic_quaternion128:
  198. {
  199. LLVMMetadataRef elements[4] = {};
  200. elements[0] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 0);
  201. elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f32, 4);
  202. elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f32, 8);
  203. elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f32, 12);
  204. return lb_debug_basic_struct(m, str_lit("quaternion128"), 128, 32, elements, gb_count_of(elements));
  205. }
  206. case Basic_quaternion256:
  207. {
  208. LLVMMetadataRef elements[4] = {};
  209. elements[0] = lb_debug_struct_field(m, str_lit("imag"), t_f64, 0);
  210. elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f64, 8);
  211. elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f64, 16);
  212. elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f64, 24);
  213. return lb_debug_basic_struct(m, str_lit("quaternion256"), 256, 32, elements, gb_count_of(elements));
  214. }
  215. case Basic_rawptr:
  216. {
  217. LLVMMetadataRef void_type = lb_debug_type_basic_type(m, str_lit("void"), 8, LLVMDWARFTypeEncoding_Unsigned);
  218. return LLVMDIBuilderCreatePointerType(m->debug_builder, void_type, word_bits, word_bits, LLVMDWARFTypeEncoding_Address, "rawptr", 6);
  219. }
  220. case Basic_string:
  221. {
  222. LLVMMetadataRef elements[2] = {};
  223. elements[0] = lb_debug_struct_field(m, str_lit("data"), t_u8_ptr, 0);
  224. elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, word_bits);
  225. return lb_debug_basic_struct(m, str_lit("string"), 2*word_bits, word_bits, elements, gb_count_of(elements));
  226. }
  227. case Basic_cstring:
  228. {
  229. LLVMMetadataRef char_type = lb_debug_type_basic_type(m, str_lit("char"), 8, LLVMDWARFTypeEncoding_Unsigned);
  230. return LLVMDIBuilderCreatePointerType(m->debug_builder, char_type, word_bits, word_bits, 0, "cstring", 7);
  231. }
  232. case Basic_any:
  233. {
  234. LLVMMetadataRef elements[2] = {};
  235. elements[0] = lb_debug_struct_field(m, str_lit("data"), t_rawptr, 0);
  236. elements[1] = lb_debug_struct_field(m, str_lit("id"), t_typeid, word_bits);
  237. return lb_debug_basic_struct(m, str_lit("any"), 2*word_bits, word_bits, elements, gb_count_of(elements));
  238. }
  239. // Untyped types
  240. case Basic_UntypedBool: GB_PANIC("Basic_UntypedBool"); break;
  241. case Basic_UntypedInteger: GB_PANIC("Basic_UntypedInteger"); break;
  242. case Basic_UntypedFloat: GB_PANIC("Basic_UntypedFloat"); break;
  243. case Basic_UntypedComplex: GB_PANIC("Basic_UntypedComplex"); break;
  244. case Basic_UntypedQuaternion: GB_PANIC("Basic_UntypedQuaternion"); break;
  245. case Basic_UntypedString: GB_PANIC("Basic_UntypedString"); break;
  246. case Basic_UntypedRune: GB_PANIC("Basic_UntypedRune"); break;
  247. case Basic_UntypedNil: GB_PANIC("Basic_UntypedNil"); break;
  248. case Basic_UntypedUndef: GB_PANIC("Basic_UntypedUndef"); break;
  249. default: GB_PANIC("Basic Unhandled"); break;
  250. }
  251. break;
  252. case Type_Named:
  253. GB_PANIC("Type_Named should be handled in lb_debug_type separately");
  254. case Type_SoaPointer:
  255. case Type_Pointer:
  256. return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->Pointer.elem), word_bits, word_bits, 0, nullptr, 0);
  257. case Type_MultiPointer:
  258. return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->MultiPointer.elem), word_bits, word_bits, 0, nullptr, 0);
  259. case Type_Array: {
  260. LLVMMetadataRef subscripts[1] = {};
  261. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  262. 0ll,
  263. type->Array.count
  264. );
  265. return LLVMDIBuilderCreateArrayType(m->debug_builder,
  266. 8*cast(uint64_t)type_size_of(type),
  267. 8*cast(unsigned)type_align_of(type),
  268. lb_debug_type(m, type->Array.elem),
  269. subscripts, gb_count_of(subscripts));
  270. }
  271. case Type_EnumeratedArray: {
  272. LLVMMetadataRef subscripts[1] = {};
  273. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  274. 0ll,
  275. type->EnumeratedArray.count
  276. );
  277. LLVMMetadataRef array_type = LLVMDIBuilderCreateArrayType(m->debug_builder,
  278. 8*cast(uint64_t)type_size_of(type),
  279. 8*cast(unsigned)type_align_of(type),
  280. lb_debug_type(m, type->EnumeratedArray.elem),
  281. subscripts, gb_count_of(subscripts));
  282. gbString name = type_to_string(type, temporary_allocator());
  283. return LLVMDIBuilderCreateTypedef(m->debug_builder, array_type, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
  284. }
  285. case Type_Struct:
  286. case Type_Union:
  287. case Type_Slice:
  288. case Type_DynamicArray:
  289. case Type_Map:
  290. case Type_BitSet:
  291. {
  292. unsigned tag = DW_TAG_structure_type;
  293. if (is_type_raw_union(type) || is_type_union(type)) {
  294. tag = DW_TAG_union_type;
  295. }
  296. u64 size_in_bits = cast(u64)(8*type_size_of(type));
  297. u32 align_in_bits = cast(u32)(8*type_size_of(type));
  298. LLVMDIFlags flags = LLVMDIFlagZero;
  299. LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType(
  300. m->debug_builder, tag, "", 0, nullptr, nullptr, 0, 0, size_in_bits, align_in_bits, flags, "", 0
  301. );
  302. lbIncompleteDebugType idt = {};
  303. idt.type = type;
  304. idt.metadata = temp_forward_decl;
  305. array_add(&m->debug_incomplete_types, idt);
  306. lb_set_llvm_metadata(m, type, temp_forward_decl);
  307. return temp_forward_decl;
  308. }
  309. case Type_Enum:
  310. {
  311. LLVMMetadataRef scope = nullptr;
  312. LLVMMetadataRef file = nullptr;
  313. unsigned line = 0;
  314. unsigned element_count = cast(unsigned)type->Enum.fields.count;
  315. LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
  316. Type *bt = base_enum_type(type);
  317. LLVMBool is_unsigned = is_type_unsigned(bt);
  318. for (unsigned i = 0; i < element_count; i++) {
  319. Entity *f = type->Enum.fields[i];
  320. GB_ASSERT(f->kind == Entity_Constant);
  321. String name = f->token.string;
  322. i64 value = exact_value_to_i64(f->Constant.value);
  323. elements[i] = LLVMDIBuilderCreateEnumerator(m->debug_builder, cast(char const *)name.text, cast(size_t)name.len, value, is_unsigned);
  324. }
  325. LLVMMetadataRef class_type = lb_debug_type(m, bt);
  326. return LLVMDIBuilderCreateEnumerationType(m->debug_builder, scope, "", 0, file, line, 8*type_size_of(type), 8*cast(unsigned)type_align_of(type), elements, element_count, class_type);
  327. }
  328. case Type_Tuple:
  329. if (type->Tuple.variables.count == 1) {
  330. return lb_debug_type(m, type->Tuple.variables[0]->type);
  331. } else {
  332. type_set_offsets(type);
  333. LLVMMetadataRef parent_scope = nullptr;
  334. LLVMMetadataRef scope = nullptr;
  335. LLVMMetadataRef file = nullptr;
  336. unsigned line = 0;
  337. u64 size_in_bits = 8*cast(u64)type_size_of(type);
  338. u32 align_in_bits = 8*cast(u32)type_align_of(type);
  339. LLVMDIFlags flags = LLVMDIFlagZero;
  340. unsigned element_count = cast(unsigned)type->Tuple.variables.count;
  341. LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
  342. for (unsigned i = 0; i < element_count; i++) {
  343. Entity *f = type->Tuple.variables[i];
  344. GB_ASSERT(f->kind == Entity_Variable);
  345. String name = f->token.string;
  346. unsigned field_line = 0;
  347. LLVMDIFlags field_flags = LLVMDIFlagZero;
  348. u64 offset_in_bits = 8*cast(u64)type->Tuple.offsets[i];
  349. elements[i] = LLVMDIBuilderCreateMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, field_line,
  350. 8*cast(u64)type_size_of(f->type), 8*cast(u32)type_align_of(f->type), offset_in_bits,
  351. field_flags, lb_debug_type(m, f->type)
  352. );
  353. }
  354. return LLVMDIBuilderCreateStructType(m->debug_builder, parent_scope, "", 0, file, line,
  355. size_in_bits, align_in_bits, flags,
  356. nullptr, elements, element_count, 0, nullptr,
  357. "", 0
  358. );
  359. }
  360. case Type_Proc:
  361. {
  362. LLVMMetadataRef proc_underlying_type = lb_debug_type_internal_proc(m, type);
  363. LLVMMetadataRef pointer_type = LLVMDIBuilderCreatePointerType(m->debug_builder, proc_underlying_type, word_bits, word_bits, 0, nullptr, 0);
  364. gbString name = type_to_string(type, temporary_allocator());
  365. return LLVMDIBuilderCreateTypedef(m->debug_builder, pointer_type, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
  366. }
  367. break;
  368. case Type_SimdVector:
  369. {
  370. LLVMMetadataRef elem = lb_debug_type(m, type->SimdVector.elem);
  371. LLVMMetadataRef subscripts[1] = {};
  372. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  373. 0ll,
  374. type->SimdVector.count
  375. );
  376. return LLVMDIBuilderCreateVectorType(
  377. m->debug_builder,
  378. 8*cast(unsigned)type_size_of(type), 8*cast(unsigned)type_align_of(type),
  379. elem, subscripts, gb_count_of(subscripts));
  380. }
  381. case Type_RelativePointer: {
  382. LLVMMetadataRef base_integer = lb_debug_type(m, type->RelativePointer.base_integer);
  383. gbString name = type_to_string(type, temporary_allocator());
  384. return LLVMDIBuilderCreateTypedef(m->debug_builder, base_integer, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
  385. }
  386. case Type_RelativeSlice:
  387. {
  388. unsigned element_count = 0;
  389. LLVMMetadataRef elements[2] = {};
  390. Type *base_integer = type->RelativeSlice.base_integer;
  391. elements[0] = lb_debug_struct_field(m, str_lit("data_offset"), base_integer, 0);
  392. elements[1] = lb_debug_struct_field(m, str_lit("len"), base_integer, 8*type_size_of(base_integer));
  393. gbString name = type_to_string(type, temporary_allocator());
  394. return LLVMDIBuilderCreateStructType(m->debug_builder, nullptr, name, gb_string_length(name), nullptr, 0, 2*word_bits, word_bits, LLVMDIFlagZero, nullptr, elements, element_count, 0, nullptr, "", 0);
  395. }
  396. case Type_Matrix: {
  397. LLVMMetadataRef subscripts[1] = {};
  398. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  399. 0ll,
  400. matrix_type_total_internal_elems(type)
  401. );
  402. return LLVMDIBuilderCreateArrayType(m->debug_builder,
  403. 8*cast(uint64_t)type_size_of(type),
  404. 8*cast(unsigned)type_align_of(type),
  405. lb_debug_type(m, type->Matrix.elem),
  406. subscripts, gb_count_of(subscripts));
  407. }
  408. }
  409. GB_PANIC("Invalid type %s", type_to_string(type));
  410. return nullptr;
  411. }
  412. LLVMMetadataRef lb_get_base_scope_metadata(lbModule *m, Scope *scope) {
  413. LLVMMetadataRef found = nullptr;
  414. for (;;) {
  415. if (scope == nullptr) {
  416. return nullptr;
  417. }
  418. if (scope->flags & ScopeFlag_Proc) {
  419. found = lb_get_llvm_metadata(m, scope->procedure_entity);
  420. if (found) {
  421. return found;
  422. }
  423. }
  424. if (scope->flags & ScopeFlag_File) {
  425. found = lb_get_llvm_metadata(m, scope->file);
  426. if (found) {
  427. return found;
  428. }
  429. }
  430. scope = scope->parent;
  431. }
  432. }
  433. LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) {
  434. GB_ASSERT(type != nullptr);
  435. LLVMMetadataRef found = lb_get_llvm_metadata(m, type);
  436. if (found != nullptr) {
  437. return found;
  438. }
  439. if (type->kind == Type_Named) {
  440. LLVMMetadataRef file = nullptr;
  441. unsigned line = 0;
  442. LLVMMetadataRef scope = nullptr;
  443. if (type->Named.type_name != nullptr) {
  444. Entity *e = type->Named.type_name;
  445. scope = lb_get_base_scope_metadata(m, e->scope);
  446. if (scope != nullptr) {
  447. file = LLVMDIScopeGetFile(scope);
  448. }
  449. line = cast(unsigned)e->token.pos.line;
  450. }
  451. // TODO(bill): location data for Type_Named
  452. u64 size_in_bits = 8*type_size_of(type);
  453. u32 align_in_bits = 8*cast(u32)type_align_of(type);
  454. String name = type->Named.name;
  455. char const *name_text = cast(char const *)name.text;
  456. size_t name_len = cast(size_t)name.len;
  457. unsigned tag = DW_TAG_structure_type;
  458. if (is_type_raw_union(type) || is_type_union(type)) {
  459. tag = DW_TAG_union_type;
  460. }
  461. LLVMDIFlags flags = LLVMDIFlagZero;
  462. Type *bt = base_type(type->Named.base);
  463. lbIncompleteDebugType idt = {};
  464. idt.type = type;
  465. switch (bt->kind) {
  466. case Type_Enum:
  467. {
  468. unsigned line = 0;
  469. unsigned element_count = cast(unsigned)bt->Enum.fields.count;
  470. LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
  471. Type *ct = base_enum_type(type);
  472. LLVMBool is_unsigned = is_type_unsigned(ct);
  473. for (unsigned i = 0; i < element_count; i++) {
  474. Entity *f = bt->Enum.fields[i];
  475. GB_ASSERT(f->kind == Entity_Constant);
  476. String name = f->token.string;
  477. i64 value = exact_value_to_i64(f->Constant.value);
  478. elements[i] = LLVMDIBuilderCreateEnumerator(m->debug_builder, cast(char const *)name.text, cast(size_t)name.len, value, is_unsigned);
  479. }
  480. LLVMMetadataRef class_type = lb_debug_type(m, ct);
  481. return LLVMDIBuilderCreateEnumerationType(m->debug_builder, scope, name_text, name_len, file, line, 8*type_size_of(type), 8*cast(unsigned)type_align_of(type), elements, element_count, class_type);
  482. }
  483. default:
  484. {
  485. LLVMMetadataRef debug_bt = lb_debug_type(m, bt);
  486. LLVMMetadataRef final_decl = LLVMDIBuilderCreateTypedef(m->debug_builder, debug_bt, name_text, name_len, file, line, scope, align_in_bits);
  487. lb_set_llvm_metadata(m, type, final_decl);
  488. return final_decl;
  489. }
  490. case Type_Slice:
  491. case Type_DynamicArray:
  492. case Type_Map:
  493. case Type_Struct:
  494. case Type_Union:
  495. case Type_BitSet:
  496. LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType(
  497. m->debug_builder, tag, name_text, name_len, nullptr, nullptr, 0, 0, size_in_bits, align_in_bits, flags, "", 0
  498. );
  499. idt.metadata = temp_forward_decl;
  500. array_add(&m->debug_incomplete_types, idt);
  501. lb_set_llvm_metadata(m, type, temp_forward_decl);
  502. return temp_forward_decl;
  503. }
  504. }
  505. LLVMMetadataRef dt = lb_debug_type_internal(m, type);
  506. lb_set_llvm_metadata(m, type, dt);
  507. return dt;
  508. }
  509. void lb_debug_complete_types(lbModule *m) {
  510. /* unsigned const word_size = cast(unsigned)build_context.word_size; */
  511. unsigned const word_bits = cast(unsigned)(8*build_context.word_size);
  512. for_array(debug_incomplete_type_index, m->debug_incomplete_types) {
  513. auto const &idt = m->debug_incomplete_types[debug_incomplete_type_index];
  514. GB_ASSERT(idt.type != nullptr);
  515. GB_ASSERT(idt.metadata != nullptr);
  516. Type *t = idt.type;
  517. Type *bt = base_type(t);
  518. LLVMMetadataRef parent_scope = nullptr;
  519. LLVMMetadataRef file = nullptr;
  520. unsigned line_number = 0;
  521. u64 size_in_bits = 8*type_size_of(t);
  522. u32 align_in_bits = cast(u32)(8*type_align_of(t));
  523. LLVMDIFlags flags = LLVMDIFlagZero;
  524. LLVMMetadataRef derived_from = nullptr;
  525. LLVMMetadataRef *elements = nullptr;
  526. unsigned element_count = 0;
  527. unsigned runtime_lang = 0; // Objective-C runtime version
  528. char const *unique_id = "";
  529. LLVMMetadataRef vtable_holder = nullptr;
  530. size_t unique_id_len = 0;
  531. LLVMMetadataRef record_scope = nullptr;
  532. switch (bt->kind) {
  533. case Type_Slice:
  534. case Type_DynamicArray:
  535. case Type_Map:
  536. case Type_Struct:
  537. case Type_Union:
  538. case Type_BitSet: {
  539. bool is_union = is_type_raw_union(bt) || is_type_union(bt);
  540. String name = str_lit("<anonymous-struct>");
  541. if (t->kind == Type_Named) {
  542. name = t->Named.name;
  543. if (t->Named.type_name && t->Named.type_name->pkg && t->Named.type_name->pkg->name.len != 0) {
  544. name = concatenate3_strings(temporary_allocator(), t->Named.type_name->pkg->name, str_lit("."), t->Named.name);
  545. }
  546. LLVMMetadataRef file = nullptr;
  547. unsigned line = 0;
  548. LLVMMetadataRef file_scope = nullptr;
  549. if (t->Named.type_name != nullptr) {
  550. Entity *e = t->Named.type_name;
  551. file_scope = lb_get_llvm_metadata(m, e->scope);
  552. if (file_scope != nullptr) {
  553. file = LLVMDIScopeGetFile(file_scope);
  554. }
  555. line = cast(unsigned)e->token.pos.line;
  556. }
  557. // TODO(bill): location data for Type_Named
  558. } else {
  559. name = make_string_c(type_to_string(t, temporary_allocator()));
  560. }
  561. switch (bt->kind) {
  562. case Type_Slice:
  563. element_count = 2;
  564. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  565. elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->Slice.elem), 0*word_bits);
  566. elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, 1*word_bits);
  567. break;
  568. case Type_DynamicArray:
  569. element_count = 4;
  570. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  571. elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->DynamicArray.elem), 0*word_bits);
  572. elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, 1*word_bits);
  573. elements[2] = lb_debug_struct_field(m, str_lit("cap"), t_int, 2*word_bits);
  574. elements[3] = lb_debug_struct_field(m, str_lit("allocator"), t_allocator, 3*word_bits);
  575. break;
  576. case Type_Map:
  577. bt = bt->Map.internal_type;
  578. /*fallthrough*/
  579. case Type_Struct:
  580. if (file == nullptr) {
  581. if (bt->Struct.node) {
  582. file = lb_get_llvm_metadata(m, bt->Struct.node->file());
  583. line_number = cast(unsigned)ast_token(bt->Struct.node).pos.line;
  584. }
  585. }
  586. type_set_offsets(bt);
  587. {
  588. isize element_offset = 0;
  589. record_scope = lb_get_llvm_metadata(m, bt->Struct.scope);
  590. switch (bt->Struct.soa_kind) {
  591. case StructSoa_Slice: element_offset = 1; break;
  592. case StructSoa_Dynamic: element_offset = 3; break;
  593. }
  594. element_count = cast(unsigned)(bt->Struct.fields.count + element_offset);
  595. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  596. isize field_size_bits = 8*type_size_of(bt) - element_offset*word_bits;
  597. switch (bt->Struct.soa_kind) {
  598. case StructSoa_Slice:
  599. elements[0] = LLVMDIBuilderCreateMemberType(
  600. m->debug_builder, record_scope,
  601. ".len", 4,
  602. file, 0,
  603. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  604. field_size_bits,
  605. LLVMDIFlagZero, lb_debug_type(m, t_int)
  606. );
  607. break;
  608. case StructSoa_Dynamic:
  609. elements[0] = LLVMDIBuilderCreateMemberType(
  610. m->debug_builder, record_scope,
  611. ".len", 4,
  612. file, 0,
  613. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  614. field_size_bits + 0*word_bits,
  615. LLVMDIFlagZero, lb_debug_type(m, t_int)
  616. );
  617. elements[1] = LLVMDIBuilderCreateMemberType(
  618. m->debug_builder, record_scope,
  619. ".cap", 4,
  620. file, 0,
  621. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  622. field_size_bits + 1*word_bits,
  623. LLVMDIFlagZero, lb_debug_type(m, t_int)
  624. );
  625. elements[2] = LLVMDIBuilderCreateMemberType(
  626. m->debug_builder, record_scope,
  627. ".allocator", 10,
  628. file, 0,
  629. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  630. field_size_bits + 2*word_bits,
  631. LLVMDIFlagZero, lb_debug_type(m, t_allocator)
  632. );
  633. break;
  634. }
  635. for_array(j, bt->Struct.fields) {
  636. Entity *f = bt->Struct.fields[j];
  637. String fname = f->token.string;
  638. unsigned field_line = 0;
  639. LLVMDIFlags field_flags = LLVMDIFlagZero;
  640. GB_ASSERT(bt->Struct.offsets != nullptr);
  641. u64 offset_in_bits = 8*cast(u64)bt->Struct.offsets[j];
  642. elements[element_offset+j] = LLVMDIBuilderCreateMemberType(
  643. m->debug_builder, record_scope,
  644. cast(char const *)fname.text, cast(size_t)fname.len,
  645. file, field_line,
  646. 8*cast(u64)type_size_of(f->type), 8*cast(u32)type_align_of(f->type),
  647. offset_in_bits,
  648. field_flags, lb_debug_type(m, f->type)
  649. );
  650. }
  651. }
  652. break;
  653. case Type_Union:
  654. {
  655. if (file == nullptr) {
  656. GB_ASSERT(bt->Union.node != nullptr);
  657. file = lb_get_llvm_metadata(m, bt->Union.node->file());
  658. line_number = cast(unsigned)ast_token(bt->Union.node).pos.line;
  659. }
  660. isize index_offset = 1;
  661. if (is_type_union_maybe_pointer(bt)) {
  662. index_offset = 0;
  663. }
  664. record_scope = lb_get_llvm_metadata(m, bt->Union.scope);
  665. element_count = cast(unsigned)bt->Union.variants.count;
  666. if (index_offset > 0) {
  667. element_count += 1;
  668. }
  669. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  670. if (index_offset > 0) {
  671. Type *tag_type = union_tag_type(bt);
  672. unsigned field_line = 0;
  673. u64 offset_in_bits = 8*cast(u64)bt->Union.variant_block_size;
  674. LLVMDIFlags field_flags = LLVMDIFlagZero;
  675. elements[0] = LLVMDIBuilderCreateMemberType(
  676. m->debug_builder, record_scope,
  677. "tag", 3,
  678. file, field_line,
  679. 8*cast(u64)type_size_of(tag_type), 8*cast(u32)type_align_of(tag_type),
  680. offset_in_bits,
  681. field_flags, lb_debug_type(m, tag_type)
  682. );
  683. }
  684. for_array(j, bt->Union.variants) {
  685. Type *variant = bt->Union.variants[j];
  686. unsigned field_index = cast(unsigned)(index_offset+j);
  687. char name[16] = {};
  688. gb_snprintf(name, gb_size_of(name), "v%u", field_index);
  689. isize name_len = gb_strlen(name);
  690. unsigned field_line = 0;
  691. LLVMDIFlags field_flags = LLVMDIFlagZero;
  692. u64 offset_in_bits = 0;
  693. elements[field_index] = LLVMDIBuilderCreateMemberType(
  694. m->debug_builder, record_scope,
  695. name, name_len,
  696. file, field_line,
  697. 8*cast(u64)type_size_of(variant), 8*cast(u32)type_align_of(variant),
  698. offset_in_bits,
  699. field_flags, lb_debug_type(m, variant)
  700. );
  701. }
  702. }
  703. break;
  704. case Type_BitSet:
  705. {
  706. if (file == nullptr) {
  707. GB_ASSERT(bt->BitSet.node != nullptr);
  708. file = lb_get_llvm_metadata(m, bt->BitSet.node->file());
  709. line_number = cast(unsigned)ast_token(bt->BitSet.node).pos.line;
  710. }
  711. LLVMMetadataRef bit_set_field_type = lb_debug_type(m, t_bool);
  712. LLVMMetadataRef scope = file;
  713. Type *elem = base_type(bt->BitSet.elem);
  714. if (elem->kind == Type_Enum) {
  715. element_count = cast(unsigned)elem->Enum.fields.count;
  716. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  717. for_array(i, elem->Enum.fields) {
  718. Entity *f = elem->Enum.fields[i];
  719. GB_ASSERT(f->kind == Entity_Constant);
  720. i64 val = exact_value_to_i64(f->Constant.value);
  721. String name = f->token.string;
  722. u64 offset_in_bits = cast(u64)(val - bt->BitSet.lower);
  723. elements[i] = LLVMDIBuilderCreateBitFieldMemberType(
  724. m->debug_builder,
  725. scope,
  726. cast(char const *)name.text, name.len,
  727. file, line_number,
  728. 1,
  729. offset_in_bits,
  730. 0,
  731. LLVMDIFlagZero,
  732. bit_set_field_type
  733. );
  734. }
  735. } else {
  736. char name[32] = {};
  737. GB_ASSERT(is_type_integer(elem));
  738. i64 count = bt->BitSet.upper - bt->BitSet.lower + 1;
  739. GB_ASSERT(0 <= count);
  740. element_count = cast(unsigned)count;
  741. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  742. for (unsigned i = 0; i < element_count; i++) {
  743. u64 offset_in_bits = i;
  744. i64 val = bt->BitSet.lower + cast(i64)i;
  745. gb_snprintf(name, gb_count_of(name), "%lld", cast(long long)val);
  746. elements[i] = LLVMDIBuilderCreateBitFieldMemberType(
  747. m->debug_builder,
  748. scope,
  749. name, gb_strlen(name),
  750. file, line_number,
  751. 1,
  752. offset_in_bits,
  753. 0,
  754. LLVMDIFlagZero,
  755. bit_set_field_type
  756. );
  757. }
  758. }
  759. }
  760. }
  761. LLVMMetadataRef final_metadata = nullptr;
  762. if (is_union) {
  763. final_metadata = LLVMDIBuilderCreateUnionType(
  764. m->debug_builder,
  765. parent_scope,
  766. cast(char const *)name.text, cast(size_t)name.len,
  767. file, line_number,
  768. size_in_bits, align_in_bits,
  769. flags,
  770. elements, element_count,
  771. runtime_lang,
  772. unique_id, unique_id_len
  773. );
  774. } else {
  775. final_metadata = LLVMDIBuilderCreateStructType(
  776. m->debug_builder,
  777. parent_scope,
  778. cast(char const *)name.text, cast(size_t)name.len,
  779. file, line_number,
  780. size_in_bits, align_in_bits,
  781. flags,
  782. derived_from,
  783. elements, element_count,
  784. runtime_lang,
  785. vtable_holder,
  786. unique_id, unique_id_len
  787. );
  788. }
  789. LLVMMetadataReplaceAllUsesWith(idt.metadata, final_metadata);
  790. lb_set_llvm_metadata(m, idt.type, final_metadata);
  791. } break;
  792. default:
  793. GB_PANIC("invalid incomplete debug type");
  794. break;
  795. }
  796. }
  797. array_clear(&m->debug_incomplete_types);
  798. }
  799. void lb_add_debug_local_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token) {
  800. if (p->debug_info == nullptr) {
  801. return;
  802. }
  803. if (type == nullptr) {
  804. return;
  805. }
  806. if (type == t_invalid) {
  807. return;
  808. }
  809. if (p->body == nullptr) {
  810. return;
  811. }
  812. lbModule *m = p->module;
  813. String const &name = token.string;
  814. if (name == "" || name == "_") {
  815. return;
  816. }
  817. if (lb_get_llvm_metadata(m, ptr) != nullptr) {
  818. // Already been set
  819. return;
  820. }
  821. AstFile *file = p->body->file();
  822. LLVMMetadataRef llvm_scope = lb_get_current_debug_scope(p);
  823. LLVMMetadataRef llvm_file = lb_get_llvm_metadata(m, file);
  824. GB_ASSERT(llvm_scope != nullptr);
  825. if (llvm_file == nullptr) {
  826. llvm_file = LLVMDIScopeGetFile(llvm_scope);
  827. }
  828. if (llvm_file == nullptr) {
  829. return;
  830. }
  831. unsigned alignment_in_bits = cast(unsigned)(8*type_align_of(type));
  832. LLVMDIFlags flags = LLVMDIFlagZero;
  833. LLVMBool always_preserve = build_context.optimization_level == 0;
  834. LLVMMetadataRef debug_type = lb_debug_type(m, type);
  835. LLVMMetadataRef var_info = LLVMDIBuilderCreateAutoVariable(
  836. m->debug_builder, llvm_scope,
  837. cast(char const *)name.text, cast(size_t)name.len,
  838. llvm_file, token.pos.line,
  839. debug_type,
  840. always_preserve, flags, alignment_in_bits
  841. );
  842. LLVMValueRef storage = ptr;
  843. LLVMBasicBlockRef block = p->curr_block->block;
  844. LLVMMetadataRef llvm_debug_loc = lb_debug_location_from_token_pos(p, token.pos);
  845. LLVMMetadataRef llvm_expr = LLVMDIBuilderCreateExpression(m->debug_builder, nullptr, 0);
  846. lb_set_llvm_metadata(m, ptr, llvm_expr);
  847. LLVMDIBuilderInsertDeclareAtEnd(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, block);
  848. }
  849. void lb_add_debug_param_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token, unsigned arg_number, lbBlock *block, lbArgKind arg_kind) {
  850. if (p->debug_info == nullptr) {
  851. return;
  852. }
  853. if (type == nullptr) {
  854. return;
  855. }
  856. if (type == t_invalid) {
  857. return;
  858. }
  859. if (p->body == nullptr) {
  860. return;
  861. }
  862. lbModule *m = p->module;
  863. String const &name = token.string;
  864. if (name == "" || name == "_") {
  865. return;
  866. }
  867. if (lb_get_llvm_metadata(m, ptr) != nullptr) {
  868. // Already been set
  869. return;
  870. }
  871. AstFile *file = p->body->file();
  872. LLVMMetadataRef llvm_scope = lb_get_current_debug_scope(p);
  873. LLVMMetadataRef llvm_file = lb_get_llvm_metadata(m, file);
  874. GB_ASSERT(llvm_scope != nullptr);
  875. if (llvm_file == nullptr) {
  876. llvm_file = LLVMDIScopeGetFile(llvm_scope);
  877. }
  878. if (llvm_file == nullptr) {
  879. return;
  880. }
  881. LLVMDIFlags flags = LLVMDIFlagZero;
  882. LLVMBool always_preserve = build_context.optimization_level == 0;
  883. LLVMMetadataRef debug_type = lb_debug_type(m, type);
  884. LLVMMetadataRef var_info = LLVMDIBuilderCreateParameterVariable(
  885. m->debug_builder, llvm_scope,
  886. cast(char const *)name.text, cast(size_t)name.len,
  887. arg_number,
  888. llvm_file, token.pos.line,
  889. debug_type,
  890. always_preserve, flags
  891. );
  892. LLVMValueRef storage = ptr;
  893. LLVMMetadataRef llvm_debug_loc = lb_debug_location_from_token_pos(p, token.pos);
  894. LLVMMetadataRef llvm_expr = LLVMDIBuilderCreateExpression(m->debug_builder, nullptr, 0);
  895. lb_set_llvm_metadata(m, ptr, llvm_expr);
  896. // NOTE(bill, 2022-02-01): For parameter values, you must insert them at the end of the decl block
  897. // The reason is that if the parameter is at index 0 and a pointer, there is not such things as an
  898. // instruction "before" it.
  899. switch (arg_kind) {
  900. case lbArg_Direct:
  901. LLVMDIBuilderInsertDbgValueAtEnd(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, block->block);
  902. break;
  903. case lbArg_Indirect:
  904. LLVMDIBuilderInsertDeclareAtEnd(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, block->block);
  905. break;
  906. }
  907. }
  908. void lb_add_debug_context_variable(lbProcedure *p, lbAddr const &ctx) {
  909. if (!p->debug_info || !p->body) {
  910. return;
  911. }
  912. LLVMMetadataRef loc = LLVMGetCurrentDebugLocation2(p->builder);
  913. if (!loc) {
  914. return;
  915. }
  916. TokenPos pos = {};
  917. pos.file_id = p->body->file_id;
  918. pos.line = LLVMDILocationGetLine(loc);
  919. pos.column = LLVMDILocationGetColumn(loc);
  920. Token token = {};
  921. token.kind = Token_context;
  922. token.string = str_lit("context");
  923. token.pos = pos;
  924. LLVMValueRef ptr = ctx.addr.value;
  925. while (LLVMIsABitCastInst(ptr)) {
  926. ptr = LLVMGetOperand(ptr, 0);
  927. }
  928. lb_add_debug_local_variable(p, ptr, t_context, token);
  929. }
  930. String debug_info_mangle_constant_name(Entity *e, bool *did_allocate_) {
  931. String name = e->token.string;
  932. if (e->pkg && e->pkg->name.len > 0) {
  933. // NOTE(bill): C++ NONSENSE FOR DEBUG SHITE!
  934. name = concatenate3_strings(heap_allocator(), e->pkg->name, str_lit("::"), name);
  935. if (did_allocate_) *did_allocate_ = true;
  936. }
  937. return name;
  938. }
  939. void add_debug_info_global_variable_expr(lbModule *m, String const &name, LLVMMetadataRef dtype, LLVMMetadataRef expr) {
  940. LLVMMetadataRef scope = nullptr;
  941. LLVMMetadataRef file = nullptr;
  942. unsigned line = 0;
  943. LLVMMetadataRef decl = nullptr;
  944. LLVMDIBuilderCreateGlobalVariableExpression(
  945. m->debug_builder, scope,
  946. cast(char const *)name.text, cast(size_t)name.len,
  947. "", 0, // Linkage
  948. file, line, dtype,
  949. false, // local to unit
  950. expr, decl, 8/*AlignInBits*/);
  951. }
  952. void add_debug_info_for_global_constant_internal_i64(lbModule *m, Entity *e, LLVMMetadataRef dtype, i64 v) {
  953. LLVMMetadataRef expr = LLVMDIBuilderCreateConstantValueExpression(m->debug_builder, v);
  954. bool did_allocate = false;
  955. String name = debug_info_mangle_constant_name(e, &did_allocate);
  956. defer (if (did_allocate) {
  957. gb_free(heap_allocator(), name.text);
  958. });
  959. add_debug_info_global_variable_expr(m, name, dtype, expr);
  960. if ((e->pkg && e->pkg->kind == Package_Init) ||
  961. (e->scope && (e->scope->flags & ScopeFlag_Global))) {
  962. add_debug_info_global_variable_expr(m, e->token.string, dtype, expr);
  963. }
  964. }
  965. void add_debug_info_for_global_constant_from_entity(lbGenerator *gen, Entity *e) {
  966. if (e == nullptr || e->kind != Entity_Constant) {
  967. return;
  968. }
  969. if (is_blank_ident(e->token)) {
  970. return;
  971. }
  972. lbModule *m = &gen->default_module;
  973. if (USE_SEPARATE_MODULES) {
  974. m = lb_pkg_module(gen, e->pkg);
  975. }
  976. if (is_type_integer(e->type)) {
  977. ExactValue const &value = e->Constant.value;
  978. if (value.kind == ExactValue_Integer) {
  979. LLVMMetadataRef dtype = nullptr;
  980. i64 v = 0;
  981. bool is_signed = false;
  982. if (big_int_is_neg(&value.value_integer)) {
  983. v = exact_value_to_i64(value);
  984. is_signed = true;
  985. } else {
  986. v = cast(i64)exact_value_to_u64(value);
  987. }
  988. if (is_type_untyped(e->type)) {
  989. dtype = lb_debug_type(m, is_signed ? t_i64 : t_u64);
  990. } else {
  991. dtype = lb_debug_type(m, e->type);
  992. }
  993. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  994. }
  995. } else if (is_type_rune(e->type)) {
  996. ExactValue const &value = e->Constant.value;
  997. if (value.kind == ExactValue_Integer) {
  998. LLVMMetadataRef dtype = lb_debug_type(m, t_rune);
  999. i64 v = exact_value_to_i64(value);
  1000. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1001. }
  1002. } else if (is_type_boolean(e->type)) {
  1003. ExactValue const &value = e->Constant.value;
  1004. if (value.kind == ExactValue_Bool) {
  1005. LLVMMetadataRef dtype = lb_debug_type(m, default_type(e->type));
  1006. i64 v = cast(i64)value.value_bool;
  1007. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1008. }
  1009. } else if (is_type_enum(e->type)) {
  1010. ExactValue const &value = e->Constant.value;
  1011. if (value.kind == ExactValue_Integer) {
  1012. LLVMMetadataRef dtype = lb_debug_type(m, default_type(e->type));
  1013. i64 v = 0;
  1014. if (big_int_is_neg(&value.value_integer)) {
  1015. v = exact_value_to_i64(value);
  1016. } else {
  1017. v = cast(i64)exact_value_to_u64(value);
  1018. }
  1019. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1020. }
  1021. } else if (is_type_pointer(e->type)) {
  1022. ExactValue const &value = e->Constant.value;
  1023. if (value.kind == ExactValue_Integer) {
  1024. LLVMMetadataRef dtype = lb_debug_type(m, default_type(e->type));
  1025. i64 v = cast(i64)exact_value_to_u64(value);
  1026. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1027. }
  1028. }
  1029. }