llvm_backend_debug.cpp 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  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_type_internal_proc(lbModule *m, Type *type) {
  43. i64 size = type_size_of(type); // Check size
  44. gb_unused(size);
  45. GB_ASSERT(type != t_invalid);
  46. /* unsigned const word_size = cast(unsigned)build_context.word_size;
  47. unsigned const word_bits = cast(unsigned)(8*build_context.word_size); */
  48. GB_ASSERT(type->kind == Type_Proc);
  49. unsigned parameter_count = 1;
  50. for (i32 i = 0; i < type->Proc.param_count; i++) {
  51. Entity *e = type->Proc.params->Tuple.variables[i];
  52. if (e->kind == Entity_Variable) {
  53. parameter_count += 1;
  54. }
  55. }
  56. LLVMMetadataRef *parameters = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, parameter_count);
  57. unsigned param_index = 0;
  58. if (type->Proc.result_count == 0) {
  59. parameters[param_index++] = nullptr;
  60. } else {
  61. parameters[param_index++] = lb_debug_type(m, type->Proc.results);
  62. }
  63. LLVMMetadataRef file = nullptr;
  64. for (i32 i = 0; i < type->Proc.param_count; i++) {
  65. Entity *e = type->Proc.params->Tuple.variables[i];
  66. if (e->kind != Entity_Variable) {
  67. continue;
  68. }
  69. parameters[param_index] = lb_debug_type(m, e->type);
  70. param_index += 1;
  71. }
  72. LLVMDIFlags flags = LLVMDIFlagZero;
  73. if (type->Proc.diverging) {
  74. flags = LLVMDIFlagNoReturn;
  75. }
  76. return LLVMDIBuilderCreateSubroutineType(m->debug_builder, file, parameters, parameter_count, flags);
  77. }
  78. LLVMMetadataRef lb_debug_struct_field(lbModule *m, String const &name, Type *type, u64 offset_in_bits) {
  79. unsigned field_line = 1;
  80. LLVMDIFlags field_flags = LLVMDIFlagZero;
  81. AstPackage *pkg = m->info->runtime_package;
  82. GB_ASSERT(pkg->files.count != 0);
  83. LLVMMetadataRef file = lb_get_llvm_metadata(m, pkg->files[0]);
  84. LLVMMetadataRef scope = file;
  85. return LLVMDIBuilderCreateMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, field_line,
  86. 8*cast(u64)type_size_of(type), 8*cast(u32)type_align_of(type), offset_in_bits,
  87. field_flags, lb_debug_type(m, type)
  88. );
  89. }
  90. LLVMMetadataRef lb_debug_basic_struct(lbModule *m, String const &name, u64 size_in_bits, u32 align_in_bits, LLVMMetadataRef *elements, unsigned element_count) {
  91. AstPackage *pkg = m->info->runtime_package;
  92. GB_ASSERT(pkg->files.count != 0);
  93. LLVMMetadataRef file = lb_get_llvm_metadata(m, pkg->files[0]);
  94. LLVMMetadataRef scope = file;
  95. 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);
  96. }
  97. LLVMMetadataRef lb_debug_type_basic_type(lbModule *m, String const &name, u64 size_in_bits, LLVMDWARFTypeEncoding encoding, LLVMDIFlags flags = LLVMDIFlagZero) {
  98. LLVMMetadataRef basic_type = LLVMDIBuilderCreateBasicType(m->debug_builder, cast(char const *)name.text, name.len, size_in_bits, encoding, flags);
  99. #if 1
  100. LLVMMetadataRef final_decl = LLVMDIBuilderCreateTypedef(m->debug_builder, basic_type, cast(char const *)name.text, name.len, nullptr, 0, nullptr, cast(u32)size_in_bits);
  101. return final_decl;
  102. #else
  103. return basic_type;
  104. #endif
  105. }
  106. LLVMMetadataRef lb_debug_type_internal(lbModule *m, Type *type) {
  107. i64 size = type_size_of(type); // Check size
  108. gb_unused(size);
  109. GB_ASSERT(type != t_invalid);
  110. /* unsigned const word_size = cast(unsigned)build_context.word_size; */
  111. unsigned const word_bits = cast(unsigned)(8*build_context.word_size);
  112. switch (type->kind) {
  113. case Type_Basic:
  114. switch (type->Basic.kind) {
  115. case Basic_llvm_bool: return lb_debug_type_basic_type(m, str_lit("llvm bool"), 1, LLVMDWARFTypeEncoding_Boolean);
  116. case Basic_bool: return lb_debug_type_basic_type(m, str_lit("bool"), 8, LLVMDWARFTypeEncoding_Boolean);
  117. case Basic_b8: return lb_debug_type_basic_type(m, str_lit("b8"), 8, LLVMDWARFTypeEncoding_Boolean);
  118. case Basic_b16: return lb_debug_type_basic_type(m, str_lit("b16"), 16, LLVMDWARFTypeEncoding_Boolean);
  119. case Basic_b32: return lb_debug_type_basic_type(m, str_lit("b32"), 32, LLVMDWARFTypeEncoding_Boolean);
  120. case Basic_b64: return lb_debug_type_basic_type(m, str_lit("b64"), 64, LLVMDWARFTypeEncoding_Boolean);
  121. case Basic_i8: return lb_debug_type_basic_type(m, str_lit("i8"), 8, LLVMDWARFTypeEncoding_Signed);
  122. case Basic_u8: return lb_debug_type_basic_type(m, str_lit("u8"), 8, LLVMDWARFTypeEncoding_Unsigned);
  123. case Basic_i16: return lb_debug_type_basic_type(m, str_lit("i16"), 16, LLVMDWARFTypeEncoding_Signed);
  124. case Basic_u16: return lb_debug_type_basic_type(m, str_lit("u16"), 16, LLVMDWARFTypeEncoding_Unsigned);
  125. case Basic_i32: return lb_debug_type_basic_type(m, str_lit("i32"), 32, LLVMDWARFTypeEncoding_Signed);
  126. case Basic_u32: return lb_debug_type_basic_type(m, str_lit("u32"), 32, LLVMDWARFTypeEncoding_Unsigned);
  127. case Basic_i64: return lb_debug_type_basic_type(m, str_lit("i64"), 64, LLVMDWARFTypeEncoding_Signed);
  128. case Basic_u64: return lb_debug_type_basic_type(m, str_lit("u64"), 64, LLVMDWARFTypeEncoding_Unsigned);
  129. case Basic_i128: return lb_debug_type_basic_type(m, str_lit("i128"), 128, LLVMDWARFTypeEncoding_Signed);
  130. case Basic_u128: return lb_debug_type_basic_type(m, str_lit("u128"), 128, LLVMDWARFTypeEncoding_Unsigned);
  131. case Basic_rune: return lb_debug_type_basic_type(m, str_lit("rune"), 32, LLVMDWARFTypeEncoding_Utf);
  132. case Basic_f16: return lb_debug_type_basic_type(m, str_lit("f16"), 16, LLVMDWARFTypeEncoding_Float);
  133. case Basic_f32: return lb_debug_type_basic_type(m, str_lit("f32"), 32, LLVMDWARFTypeEncoding_Float);
  134. case Basic_f64: return lb_debug_type_basic_type(m, str_lit("f64"), 64, LLVMDWARFTypeEncoding_Float);
  135. case Basic_int: return lb_debug_type_basic_type(m, str_lit("int"), word_bits, LLVMDWARFTypeEncoding_Signed);
  136. case Basic_uint: return lb_debug_type_basic_type(m, str_lit("uint"), word_bits, LLVMDWARFTypeEncoding_Unsigned);
  137. case Basic_uintptr: return lb_debug_type_basic_type(m, str_lit("uintptr"), word_bits, LLVMDWARFTypeEncoding_Unsigned);
  138. case Basic_typeid:
  139. return lb_debug_type_basic_type(m, str_lit("typeid"), word_bits, LLVMDWARFTypeEncoding_Unsigned);
  140. // Endian Specific Types
  141. case Basic_i16le: return lb_debug_type_basic_type(m, str_lit("i16le"), 16, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  142. case Basic_u16le: return lb_debug_type_basic_type(m, str_lit("u16le"), 16, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  143. case Basic_i32le: return lb_debug_type_basic_type(m, str_lit("i32le"), 32, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  144. case Basic_u32le: return lb_debug_type_basic_type(m, str_lit("u32le"), 32, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  145. case Basic_i64le: return lb_debug_type_basic_type(m, str_lit("i64le"), 64, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  146. case Basic_u64le: return lb_debug_type_basic_type(m, str_lit("u64le"), 64, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  147. case Basic_i128le: return lb_debug_type_basic_type(m, str_lit("i128le"), 128, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagLittleEndian);
  148. case Basic_u128le: return lb_debug_type_basic_type(m, str_lit("u128le"), 128, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagLittleEndian);
  149. case Basic_f16le: return lb_debug_type_basic_type(m, str_lit("f16le"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  150. case Basic_f32le: return lb_debug_type_basic_type(m, str_lit("f32le"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  151. case Basic_f64le: return lb_debug_type_basic_type(m, str_lit("f64le"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  152. case Basic_i16be: return lb_debug_type_basic_type(m, str_lit("i16be"), 16, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  153. case Basic_u16be: return lb_debug_type_basic_type(m, str_lit("u16be"), 16, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  154. case Basic_i32be: return lb_debug_type_basic_type(m, str_lit("i32be"), 32, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  155. case Basic_u32be: return lb_debug_type_basic_type(m, str_lit("u32be"), 32, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  156. case Basic_i64be: return lb_debug_type_basic_type(m, str_lit("i64be"), 64, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  157. case Basic_u64be: return lb_debug_type_basic_type(m, str_lit("u64be"), 64, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  158. case Basic_i128be: return lb_debug_type_basic_type(m, str_lit("i128be"), 128, LLVMDWARFTypeEncoding_Signed, LLVMDIFlagBigEndian);
  159. case Basic_u128be: return lb_debug_type_basic_type(m, str_lit("u128be"), 128, LLVMDWARFTypeEncoding_Unsigned, LLVMDIFlagBigEndian);
  160. case Basic_f16be: return lb_debug_type_basic_type(m, str_lit("f16be"), 16, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  161. case Basic_f32be: return lb_debug_type_basic_type(m, str_lit("f32be"), 32, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  162. case Basic_f64be: return lb_debug_type_basic_type(m, str_lit("f64be"), 64, LLVMDWARFTypeEncoding_Float, LLVMDIFlagLittleEndian);
  163. case Basic_complex32:
  164. {
  165. LLVMMetadataRef elements[2] = {};
  166. elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f16, 0);
  167. elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f16, 4);
  168. return lb_debug_basic_struct(m, str_lit("complex32"), 64, 32, elements, gb_count_of(elements));
  169. }
  170. case Basic_complex64:
  171. {
  172. LLVMMetadataRef elements[2] = {};
  173. elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f32, 0);
  174. elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 4);
  175. return lb_debug_basic_struct(m, str_lit("complex64"), 64, 32, elements, gb_count_of(elements));
  176. }
  177. case Basic_complex128:
  178. {
  179. LLVMMetadataRef elements[2] = {};
  180. elements[0] = lb_debug_struct_field(m, str_lit("real"), t_f64, 0);
  181. elements[1] = lb_debug_struct_field(m, str_lit("imag"), t_f64, 8);
  182. return lb_debug_basic_struct(m, str_lit("complex128"), 128, 64, elements, gb_count_of(elements));
  183. }
  184. case Basic_quaternion64:
  185. {
  186. LLVMMetadataRef elements[4] = {};
  187. elements[0] = lb_debug_struct_field(m, str_lit("imag"), t_f16, 0);
  188. elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f16, 4);
  189. elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f16, 8);
  190. elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f16, 12);
  191. return lb_debug_basic_struct(m, str_lit("quaternion64"), 128, 32, elements, gb_count_of(elements));
  192. }
  193. case Basic_quaternion128:
  194. {
  195. LLVMMetadataRef elements[4] = {};
  196. elements[0] = lb_debug_struct_field(m, str_lit("imag"), t_f32, 0);
  197. elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f32, 4);
  198. elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f32, 8);
  199. elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f32, 12);
  200. return lb_debug_basic_struct(m, str_lit("quaternion128"), 128, 32, elements, gb_count_of(elements));
  201. }
  202. case Basic_quaternion256:
  203. {
  204. LLVMMetadataRef elements[4] = {};
  205. elements[0] = lb_debug_struct_field(m, str_lit("imag"), t_f64, 0);
  206. elements[1] = lb_debug_struct_field(m, str_lit("jmag"), t_f64, 8);
  207. elements[2] = lb_debug_struct_field(m, str_lit("kmag"), t_f64, 16);
  208. elements[3] = lb_debug_struct_field(m, str_lit("real"), t_f64, 24);
  209. return lb_debug_basic_struct(m, str_lit("quaternion256"), 256, 32, elements, gb_count_of(elements));
  210. }
  211. case Basic_rawptr:
  212. {
  213. LLVMMetadataRef void_type = lb_debug_type_basic_type(m, str_lit("void"), 8, LLVMDWARFTypeEncoding_Unsigned);
  214. return LLVMDIBuilderCreatePointerType(m->debug_builder, void_type, word_bits, word_bits, LLVMDWARFTypeEncoding_Address, "rawptr", 6);
  215. }
  216. case Basic_string:
  217. {
  218. LLVMMetadataRef elements[2] = {};
  219. elements[0] = lb_debug_struct_field(m, str_lit("data"), t_u8_ptr, 0);
  220. elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, word_bits);
  221. return lb_debug_basic_struct(m, str_lit("string"), 2*word_bits, word_bits, elements, gb_count_of(elements));
  222. }
  223. case Basic_cstring:
  224. {
  225. LLVMMetadataRef char_type = lb_debug_type_basic_type(m, str_lit("char"), 8, LLVMDWARFTypeEncoding_Unsigned);
  226. return LLVMDIBuilderCreatePointerType(m->debug_builder, char_type, word_bits, word_bits, 0, "cstring", 7);
  227. }
  228. case Basic_any:
  229. {
  230. LLVMMetadataRef elements[2] = {};
  231. elements[0] = lb_debug_struct_field(m, str_lit("data"), t_rawptr, 0);
  232. elements[1] = lb_debug_struct_field(m, str_lit("id"), t_typeid, word_bits);
  233. return lb_debug_basic_struct(m, str_lit("any"), 2*word_bits, word_bits, elements, gb_count_of(elements));
  234. }
  235. // Untyped types
  236. case Basic_UntypedBool: GB_PANIC("Basic_UntypedBool"); break;
  237. case Basic_UntypedInteger: GB_PANIC("Basic_UntypedInteger"); break;
  238. case Basic_UntypedFloat: GB_PANIC("Basic_UntypedFloat"); break;
  239. case Basic_UntypedComplex: GB_PANIC("Basic_UntypedComplex"); break;
  240. case Basic_UntypedQuaternion: GB_PANIC("Basic_UntypedQuaternion"); break;
  241. case Basic_UntypedString: GB_PANIC("Basic_UntypedString"); break;
  242. case Basic_UntypedRune: GB_PANIC("Basic_UntypedRune"); break;
  243. case Basic_UntypedNil: GB_PANIC("Basic_UntypedNil"); break;
  244. case Basic_UntypedUndef: GB_PANIC("Basic_UntypedUndef"); break;
  245. default: GB_PANIC("Basic Unhandled"); break;
  246. }
  247. break;
  248. case Type_Named:
  249. GB_PANIC("Type_Named should be handled in lb_debug_type separately");
  250. case Type_Pointer:
  251. return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->Pointer.elem), word_bits, word_bits, 0, nullptr, 0);
  252. case Type_MultiPointer:
  253. return LLVMDIBuilderCreatePointerType(m->debug_builder, lb_debug_type(m, type->MultiPointer.elem), word_bits, word_bits, 0, nullptr, 0);
  254. case Type_Array: {
  255. LLVMMetadataRef subscripts[1] = {};
  256. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  257. 0ll,
  258. type->Array.count
  259. );
  260. return LLVMDIBuilderCreateArrayType(m->debug_builder,
  261. 8*cast(uint64_t)type_size_of(type),
  262. 8*cast(unsigned)type_align_of(type),
  263. lb_debug_type(m, type->Array.elem),
  264. subscripts, gb_count_of(subscripts));
  265. }
  266. case Type_EnumeratedArray: {
  267. LLVMMetadataRef subscripts[1] = {};
  268. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  269. 0ll,
  270. type->EnumeratedArray.count
  271. );
  272. LLVMMetadataRef array_type = LLVMDIBuilderCreateArrayType(m->debug_builder,
  273. 8*cast(uint64_t)type_size_of(type),
  274. 8*cast(unsigned)type_align_of(type),
  275. lb_debug_type(m, type->EnumeratedArray.elem),
  276. subscripts, gb_count_of(subscripts));
  277. gbString name = type_to_string(type, temporary_allocator());
  278. return LLVMDIBuilderCreateTypedef(m->debug_builder, array_type, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
  279. }
  280. case Type_Struct:
  281. case Type_Union:
  282. case Type_Slice:
  283. case Type_DynamicArray:
  284. case Type_Map:
  285. case Type_BitSet:
  286. {
  287. unsigned tag = DW_TAG_structure_type;
  288. if (is_type_raw_union(type) || is_type_union(type)) {
  289. tag = DW_TAG_union_type;
  290. }
  291. u64 size_in_bits = cast(u64)(8*type_size_of(type));
  292. u32 align_in_bits = cast(u32)(8*type_size_of(type));
  293. LLVMDIFlags flags = LLVMDIFlagZero;
  294. LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType(
  295. m->debug_builder, tag, "", 0, nullptr, nullptr, 0, 0, size_in_bits, align_in_bits, flags, "", 0
  296. );
  297. lbIncompleteDebugType idt = {};
  298. idt.type = type;
  299. idt.metadata = temp_forward_decl;
  300. array_add(&m->debug_incomplete_types, idt);
  301. lb_set_llvm_metadata(m, type, temp_forward_decl);
  302. return temp_forward_decl;
  303. }
  304. case Type_Enum:
  305. {
  306. LLVMMetadataRef scope = nullptr;
  307. LLVMMetadataRef file = nullptr;
  308. unsigned line = 0;
  309. unsigned element_count = cast(unsigned)type->Enum.fields.count;
  310. LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
  311. Type *bt = base_enum_type(type);
  312. LLVMBool is_unsigned = is_type_unsigned(bt);
  313. for (unsigned i = 0; i < element_count; i++) {
  314. Entity *f = type->Enum.fields[i];
  315. GB_ASSERT(f->kind == Entity_Constant);
  316. String name = f->token.string;
  317. i64 value = exact_value_to_i64(f->Constant.value);
  318. elements[i] = LLVMDIBuilderCreateEnumerator(m->debug_builder, cast(char const *)name.text, cast(size_t)name.len, value, is_unsigned);
  319. }
  320. LLVMMetadataRef class_type = lb_debug_type(m, bt);
  321. 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);
  322. }
  323. case Type_Tuple:
  324. if (type->Tuple.variables.count == 1) {
  325. return lb_debug_type(m, type->Tuple.variables[0]->type);
  326. } else {
  327. type_set_offsets(type);
  328. LLVMMetadataRef parent_scope = nullptr;
  329. LLVMMetadataRef scope = nullptr;
  330. LLVMMetadataRef file = nullptr;
  331. unsigned line = 0;
  332. u64 size_in_bits = 8*cast(u64)type_size_of(type);
  333. u32 align_in_bits = 8*cast(u32)type_align_of(type);
  334. LLVMDIFlags flags = LLVMDIFlagZero;
  335. unsigned element_count = cast(unsigned)type->Tuple.variables.count;
  336. LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
  337. for (unsigned i = 0; i < element_count; i++) {
  338. Entity *f = type->Tuple.variables[i];
  339. GB_ASSERT(f->kind == Entity_Variable);
  340. String name = f->token.string;
  341. unsigned field_line = 0;
  342. LLVMDIFlags field_flags = LLVMDIFlagZero;
  343. u64 offset_in_bits = 8*cast(u64)type->Tuple.offsets[i];
  344. elements[i] = LLVMDIBuilderCreateMemberType(m->debug_builder, scope, cast(char const *)name.text, name.len, file, field_line,
  345. 8*cast(u64)type_size_of(f->type), 8*cast(u32)type_align_of(f->type), offset_in_bits,
  346. field_flags, lb_debug_type(m, f->type)
  347. );
  348. }
  349. return LLVMDIBuilderCreateStructType(m->debug_builder, parent_scope, "", 0, file, line,
  350. size_in_bits, align_in_bits, flags,
  351. nullptr, elements, element_count, 0, nullptr,
  352. "", 0
  353. );
  354. }
  355. case Type_Proc:
  356. {
  357. LLVMMetadataRef proc_underlying_type = lb_debug_type_internal_proc(m, type);
  358. LLVMMetadataRef pointer_type = LLVMDIBuilderCreatePointerType(m->debug_builder, proc_underlying_type, word_bits, word_bits, 0, nullptr, 0);
  359. gbString name = type_to_string(type, temporary_allocator());
  360. return LLVMDIBuilderCreateTypedef(m->debug_builder, pointer_type, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
  361. }
  362. break;
  363. case Type_SimdVector:
  364. return LLVMDIBuilderCreateVectorType(m->debug_builder, cast(unsigned)type->SimdVector.count, 8*cast(unsigned)type_align_of(type), lb_debug_type(m, type->SimdVector.elem), nullptr, 0);
  365. case Type_RelativePointer: {
  366. LLVMMetadataRef base_integer = lb_debug_type(m, type->RelativePointer.base_integer);
  367. gbString name = type_to_string(type, temporary_allocator());
  368. return LLVMDIBuilderCreateTypedef(m->debug_builder, base_integer, name, gb_string_length(name), nullptr, 0, nullptr, cast(u32)(8*type_align_of(type)));
  369. }
  370. case Type_RelativeSlice:
  371. {
  372. unsigned element_count = 0;
  373. LLVMMetadataRef elements[2] = {};
  374. Type *base_integer = type->RelativeSlice.base_integer;
  375. elements[0] = lb_debug_struct_field(m, str_lit("data_offset"), base_integer, 0);
  376. elements[1] = lb_debug_struct_field(m, str_lit("len"), base_integer, 8*type_size_of(base_integer));
  377. gbString name = type_to_string(type, temporary_allocator());
  378. 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);
  379. }
  380. case Type_Matrix: {
  381. LLVMMetadataRef subscripts[1] = {};
  382. subscripts[0] = LLVMDIBuilderGetOrCreateSubrange(m->debug_builder,
  383. 0ll,
  384. matrix_type_total_internal_elems(type)
  385. );
  386. return LLVMDIBuilderCreateArrayType(m->debug_builder,
  387. 8*cast(uint64_t)type_size_of(type),
  388. 8*cast(unsigned)type_align_of(type),
  389. lb_debug_type(m, type->Matrix.elem),
  390. subscripts, gb_count_of(subscripts));
  391. }
  392. }
  393. GB_PANIC("Invalid type %s", type_to_string(type));
  394. return nullptr;
  395. }
  396. LLVMMetadataRef lb_get_base_scope_metadata(lbModule *m, Scope *scope) {
  397. LLVMMetadataRef found = nullptr;
  398. for (;;) {
  399. if (scope == nullptr) {
  400. return nullptr;
  401. }
  402. if (scope->flags & ScopeFlag_Proc) {
  403. found = lb_get_llvm_metadata(m, scope->procedure_entity);
  404. if (found) {
  405. return found;
  406. }
  407. }
  408. if (scope->flags & ScopeFlag_File) {
  409. found = lb_get_llvm_metadata(m, scope->file);
  410. if (found) {
  411. return found;
  412. }
  413. }
  414. scope = scope->parent;
  415. }
  416. }
  417. LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) {
  418. GB_ASSERT(type != nullptr);
  419. LLVMMetadataRef found = lb_get_llvm_metadata(m, type);
  420. if (found != nullptr) {
  421. return found;
  422. }
  423. if (type->kind == Type_Named) {
  424. LLVMMetadataRef file = nullptr;
  425. unsigned line = 0;
  426. LLVMMetadataRef scope = nullptr;
  427. if (type->Named.type_name != nullptr) {
  428. Entity *e = type->Named.type_name;
  429. scope = lb_get_base_scope_metadata(m, e->scope);
  430. if (scope != nullptr) {
  431. file = LLVMDIScopeGetFile(scope);
  432. }
  433. line = cast(unsigned)e->token.pos.line;
  434. }
  435. // TODO(bill): location data for Type_Named
  436. u64 size_in_bits = 8*type_size_of(type);
  437. u32 align_in_bits = 8*cast(u32)type_align_of(type);
  438. String name = type->Named.name;
  439. char const *name_text = cast(char const *)name.text;
  440. size_t name_len = cast(size_t)name.len;
  441. unsigned tag = DW_TAG_structure_type;
  442. if (is_type_raw_union(type) || is_type_union(type)) {
  443. tag = DW_TAG_union_type;
  444. }
  445. LLVMDIFlags flags = LLVMDIFlagZero;
  446. Type *bt = base_type(type->Named.base);
  447. lbIncompleteDebugType idt = {};
  448. idt.type = type;
  449. switch (bt->kind) {
  450. case Type_Enum:
  451. {
  452. unsigned line = 0;
  453. unsigned element_count = cast(unsigned)bt->Enum.fields.count;
  454. LLVMMetadataRef *elements = gb_alloc_array(permanent_allocator(), LLVMMetadataRef, element_count);
  455. Type *ct = base_enum_type(type);
  456. LLVMBool is_unsigned = is_type_unsigned(ct);
  457. for (unsigned i = 0; i < element_count; i++) {
  458. Entity *f = bt->Enum.fields[i];
  459. GB_ASSERT(f->kind == Entity_Constant);
  460. String name = f->token.string;
  461. i64 value = exact_value_to_i64(f->Constant.value);
  462. elements[i] = LLVMDIBuilderCreateEnumerator(m->debug_builder, cast(char const *)name.text, cast(size_t)name.len, value, is_unsigned);
  463. }
  464. LLVMMetadataRef class_type = lb_debug_type(m, ct);
  465. 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);
  466. }
  467. default:
  468. {
  469. LLVMMetadataRef debug_bt = lb_debug_type(m, bt);
  470. LLVMMetadataRef final_decl = LLVMDIBuilderCreateTypedef(m->debug_builder, debug_bt, name_text, name_len, file, line, scope, align_in_bits);
  471. lb_set_llvm_metadata(m, type, final_decl);
  472. return final_decl;
  473. }
  474. case Type_Slice:
  475. case Type_DynamicArray:
  476. case Type_Map:
  477. case Type_Struct:
  478. case Type_Union:
  479. case Type_BitSet:
  480. LLVMMetadataRef temp_forward_decl = LLVMDIBuilderCreateReplaceableCompositeType(
  481. m->debug_builder, tag, name_text, name_len, nullptr, nullptr, 0, 0, size_in_bits, align_in_bits, flags, "", 0
  482. );
  483. idt.metadata = temp_forward_decl;
  484. array_add(&m->debug_incomplete_types, idt);
  485. lb_set_llvm_metadata(m, type, temp_forward_decl);
  486. return temp_forward_decl;
  487. }
  488. }
  489. LLVMMetadataRef dt = lb_debug_type_internal(m, type);
  490. lb_set_llvm_metadata(m, type, dt);
  491. return dt;
  492. }
  493. void lb_debug_complete_types(lbModule *m) {
  494. /* unsigned const word_size = cast(unsigned)build_context.word_size; */
  495. unsigned const word_bits = cast(unsigned)(8*build_context.word_size);
  496. for_array(debug_incomplete_type_index, m->debug_incomplete_types) {
  497. auto const &idt = m->debug_incomplete_types[debug_incomplete_type_index];
  498. GB_ASSERT(idt.type != nullptr);
  499. GB_ASSERT(idt.metadata != nullptr);
  500. Type *t = idt.type;
  501. Type *bt = base_type(t);
  502. LLVMMetadataRef parent_scope = nullptr;
  503. LLVMMetadataRef file = nullptr;
  504. unsigned line_number = 0;
  505. u64 size_in_bits = 8*type_size_of(t);
  506. u32 align_in_bits = cast(u32)(8*type_align_of(t));
  507. LLVMDIFlags flags = LLVMDIFlagZero;
  508. LLVMMetadataRef derived_from = nullptr;
  509. LLVMMetadataRef *elements = nullptr;
  510. unsigned element_count = 0;
  511. unsigned runtime_lang = 0; // Objective-C runtime version
  512. char const *unique_id = "";
  513. LLVMMetadataRef vtable_holder = nullptr;
  514. size_t unique_id_len = 0;
  515. LLVMMetadataRef record_scope = nullptr;
  516. switch (bt->kind) {
  517. case Type_Slice:
  518. case Type_DynamicArray:
  519. case Type_Map:
  520. case Type_Struct:
  521. case Type_Union:
  522. case Type_BitSet: {
  523. bool is_union = is_type_raw_union(bt) || is_type_union(bt);
  524. String name = str_lit("<anonymous-struct>");
  525. if (t->kind == Type_Named) {
  526. name = t->Named.name;
  527. if (t->Named.type_name && t->Named.type_name->pkg && t->Named.type_name->pkg->name.len != 0) {
  528. name = concatenate3_strings(temporary_allocator(), t->Named.type_name->pkg->name, str_lit("."), t->Named.name);
  529. }
  530. LLVMMetadataRef file = nullptr;
  531. unsigned line = 0;
  532. LLVMMetadataRef file_scope = nullptr;
  533. if (t->Named.type_name != nullptr) {
  534. Entity *e = t->Named.type_name;
  535. file_scope = lb_get_llvm_metadata(m, e->scope);
  536. if (file_scope != nullptr) {
  537. file = LLVMDIScopeGetFile(file_scope);
  538. }
  539. line = cast(unsigned)e->token.pos.line;
  540. }
  541. // TODO(bill): location data for Type_Named
  542. } else {
  543. name = make_string_c(type_to_string(t, temporary_allocator()));
  544. }
  545. switch (bt->kind) {
  546. case Type_Slice:
  547. element_count = 2;
  548. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  549. elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->Slice.elem), 0*word_bits);
  550. elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, 1*word_bits);
  551. break;
  552. case Type_DynamicArray:
  553. element_count = 4;
  554. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  555. elements[0] = lb_debug_struct_field(m, str_lit("data"), alloc_type_pointer(bt->DynamicArray.elem), 0*word_bits);
  556. elements[1] = lb_debug_struct_field(m, str_lit("len"), t_int, 1*word_bits);
  557. elements[2] = lb_debug_struct_field(m, str_lit("cap"), t_int, 2*word_bits);
  558. elements[3] = lb_debug_struct_field(m, str_lit("allocator"), t_allocator, 3*word_bits);
  559. break;
  560. case Type_Map:
  561. bt = bt->Map.internal_type;
  562. /*fallthrough*/
  563. case Type_Struct:
  564. if (file == nullptr) {
  565. if (bt->Struct.node) {
  566. file = lb_get_llvm_metadata(m, bt->Struct.node->file);
  567. line_number = cast(unsigned)ast_token(bt->Struct.node).pos.line;
  568. }
  569. }
  570. type_set_offsets(bt);
  571. {
  572. isize element_offset = 0;
  573. record_scope = lb_get_llvm_metadata(m, bt->Struct.scope);
  574. switch (bt->Struct.soa_kind) {
  575. case StructSoa_Slice: element_offset = 1; break;
  576. case StructSoa_Dynamic: element_offset = 3; break;
  577. }
  578. element_count = cast(unsigned)(bt->Struct.fields.count + element_offset);
  579. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  580. isize field_size_bits = 8*type_size_of(bt) - element_offset*word_bits;
  581. switch (bt->Struct.soa_kind) {
  582. case StructSoa_Slice:
  583. elements[0] = LLVMDIBuilderCreateMemberType(
  584. m->debug_builder, record_scope,
  585. ".len", 4,
  586. file, 0,
  587. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  588. field_size_bits,
  589. LLVMDIFlagZero, lb_debug_type(m, t_int)
  590. );
  591. break;
  592. case StructSoa_Dynamic:
  593. elements[0] = LLVMDIBuilderCreateMemberType(
  594. m->debug_builder, record_scope,
  595. ".len", 4,
  596. file, 0,
  597. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  598. field_size_bits + 0*word_bits,
  599. LLVMDIFlagZero, lb_debug_type(m, t_int)
  600. );
  601. elements[1] = LLVMDIBuilderCreateMemberType(
  602. m->debug_builder, record_scope,
  603. ".cap", 4,
  604. file, 0,
  605. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  606. field_size_bits + 1*word_bits,
  607. LLVMDIFlagZero, lb_debug_type(m, t_int)
  608. );
  609. elements[2] = LLVMDIBuilderCreateMemberType(
  610. m->debug_builder, record_scope,
  611. ".allocator", 10,
  612. file, 0,
  613. 8*cast(u64)type_size_of(t_int), 8*cast(u32)type_align_of(t_int),
  614. field_size_bits + 2*word_bits,
  615. LLVMDIFlagZero, lb_debug_type(m, t_allocator)
  616. );
  617. break;
  618. }
  619. for_array(j, bt->Struct.fields) {
  620. Entity *f = bt->Struct.fields[j];
  621. String fname = f->token.string;
  622. unsigned field_line = 0;
  623. LLVMDIFlags field_flags = LLVMDIFlagZero;
  624. GB_ASSERT(bt->Struct.offsets != nullptr);
  625. u64 offset_in_bits = 8*cast(u64)bt->Struct.offsets[j];
  626. elements[element_offset+j] = LLVMDIBuilderCreateMemberType(
  627. m->debug_builder, record_scope,
  628. cast(char const *)fname.text, cast(size_t)fname.len,
  629. file, field_line,
  630. 8*cast(u64)type_size_of(f->type), 8*cast(u32)type_align_of(f->type),
  631. offset_in_bits,
  632. field_flags, lb_debug_type(m, f->type)
  633. );
  634. }
  635. }
  636. break;
  637. case Type_Union:
  638. {
  639. if (file == nullptr) {
  640. GB_ASSERT(bt->Union.node != nullptr);
  641. file = lb_get_llvm_metadata(m, bt->Union.node->file);
  642. line_number = cast(unsigned)ast_token(bt->Union.node).pos.line;
  643. }
  644. isize index_offset = 1;
  645. if (is_type_union_maybe_pointer(bt)) {
  646. index_offset = 0;
  647. }
  648. record_scope = lb_get_llvm_metadata(m, bt->Union.scope);
  649. element_count = cast(unsigned)bt->Union.variants.count;
  650. if (index_offset > 0) {
  651. element_count += 1;
  652. }
  653. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  654. if (index_offset > 0) {
  655. Type *tag_type = union_tag_type(bt);
  656. unsigned field_line = 0;
  657. u64 offset_in_bits = 8*cast(u64)bt->Union.variant_block_size;
  658. LLVMDIFlags field_flags = LLVMDIFlagZero;
  659. elements[0] = LLVMDIBuilderCreateMemberType(
  660. m->debug_builder, record_scope,
  661. "tag", 3,
  662. file, field_line,
  663. 8*cast(u64)type_size_of(tag_type), 8*cast(u32)type_align_of(tag_type),
  664. offset_in_bits,
  665. field_flags, lb_debug_type(m, tag_type)
  666. );
  667. }
  668. for_array(j, bt->Union.variants) {
  669. Type *variant = bt->Union.variants[j];
  670. unsigned field_index = cast(unsigned)(index_offset+j);
  671. char name[16] = {};
  672. gb_snprintf(name, gb_size_of(name), "v%u", field_index);
  673. isize name_len = gb_strlen(name);
  674. unsigned field_line = 0;
  675. LLVMDIFlags field_flags = LLVMDIFlagZero;
  676. u64 offset_in_bits = 0;
  677. elements[field_index] = LLVMDIBuilderCreateMemberType(
  678. m->debug_builder, record_scope,
  679. name, name_len,
  680. file, field_line,
  681. 8*cast(u64)type_size_of(variant), 8*cast(u32)type_align_of(variant),
  682. offset_in_bits,
  683. field_flags, lb_debug_type(m, variant)
  684. );
  685. }
  686. }
  687. break;
  688. case Type_BitSet:
  689. {
  690. if (file == nullptr) {
  691. GB_ASSERT(bt->BitSet.node != nullptr);
  692. file = lb_get_llvm_metadata(m, bt->BitSet.node->file);
  693. line_number = cast(unsigned)ast_token(bt->BitSet.node).pos.line;
  694. }
  695. LLVMMetadataRef bit_set_field_type = lb_debug_type(m, t_bool);
  696. LLVMMetadataRef scope = file;
  697. Type *elem = base_type(bt->BitSet.elem);
  698. if (elem->kind == Type_Enum) {
  699. element_count = cast(unsigned)elem->Enum.fields.count;
  700. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  701. for_array(i, elem->Enum.fields) {
  702. Entity *f = elem->Enum.fields[i];
  703. GB_ASSERT(f->kind == Entity_Constant);
  704. i64 val = exact_value_to_i64(f->Constant.value);
  705. String name = f->token.string;
  706. u64 offset_in_bits = cast(u64)(val - bt->BitSet.lower);
  707. elements[i] = LLVMDIBuilderCreateBitFieldMemberType(
  708. m->debug_builder,
  709. scope,
  710. cast(char const *)name.text, name.len,
  711. file, line_number,
  712. 1,
  713. offset_in_bits,
  714. 0,
  715. LLVMDIFlagZero,
  716. bit_set_field_type
  717. );
  718. }
  719. } else {
  720. char name[32] = {};
  721. GB_ASSERT(is_type_integer(elem));
  722. i64 count = bt->BitSet.upper - bt->BitSet.lower + 1;
  723. GB_ASSERT(0 <= count);
  724. element_count = cast(unsigned)count;
  725. elements = gb_alloc_array(temporary_allocator(), LLVMMetadataRef, element_count);
  726. for (unsigned i = 0; i < element_count; i++) {
  727. u64 offset_in_bits = i;
  728. i64 val = bt->BitSet.lower + cast(i64)i;
  729. gb_snprintf(name, gb_count_of(name), "%lld", cast(long long)val);
  730. elements[i] = LLVMDIBuilderCreateBitFieldMemberType(
  731. m->debug_builder,
  732. scope,
  733. name, gb_strlen(name),
  734. file, line_number,
  735. 1,
  736. offset_in_bits,
  737. 0,
  738. LLVMDIFlagZero,
  739. bit_set_field_type
  740. );
  741. }
  742. }
  743. }
  744. }
  745. LLVMMetadataRef final_metadata = nullptr;
  746. if (is_union) {
  747. final_metadata = LLVMDIBuilderCreateUnionType(
  748. m->debug_builder,
  749. parent_scope,
  750. cast(char const *)name.text, cast(size_t)name.len,
  751. file, line_number,
  752. size_in_bits, align_in_bits,
  753. flags,
  754. elements, element_count,
  755. runtime_lang,
  756. unique_id, unique_id_len
  757. );
  758. } else {
  759. final_metadata = LLVMDIBuilderCreateStructType(
  760. m->debug_builder,
  761. parent_scope,
  762. cast(char const *)name.text, cast(size_t)name.len,
  763. file, line_number,
  764. size_in_bits, align_in_bits,
  765. flags,
  766. derived_from,
  767. elements, element_count,
  768. runtime_lang,
  769. vtable_holder,
  770. unique_id, unique_id_len
  771. );
  772. }
  773. LLVMMetadataReplaceAllUsesWith(idt.metadata, final_metadata);
  774. lb_set_llvm_metadata(m, idt.type, final_metadata);
  775. } break;
  776. default:
  777. GB_PANIC("invalid incomplete debug type");
  778. break;
  779. }
  780. }
  781. array_clear(&m->debug_incomplete_types);
  782. }
  783. void lb_add_debug_local_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token) {
  784. if (p->debug_info == nullptr) {
  785. return;
  786. }
  787. if (type == nullptr) {
  788. return;
  789. }
  790. if (type == t_invalid) {
  791. return;
  792. }
  793. if (p->body == nullptr) {
  794. return;
  795. }
  796. lbModule *m = p->module;
  797. String const &name = token.string;
  798. if (name == "" || name == "_") {
  799. return;
  800. }
  801. if (lb_get_llvm_metadata(m, ptr) != nullptr) {
  802. // Already been set
  803. return;
  804. }
  805. AstFile *file = p->body->file;
  806. LLVMMetadataRef llvm_scope = lb_get_current_debug_scope(p);
  807. LLVMMetadataRef llvm_file = lb_get_llvm_metadata(m, file);
  808. GB_ASSERT(llvm_scope != nullptr);
  809. if (llvm_file == nullptr) {
  810. llvm_file = LLVMDIScopeGetFile(llvm_scope);
  811. }
  812. if (llvm_file == nullptr) {
  813. return;
  814. }
  815. unsigned alignment_in_bits = cast(unsigned)(8*type_align_of(type));
  816. LLVMDIFlags flags = LLVMDIFlagZero;
  817. LLVMBool always_preserve = build_context.optimization_level == 0;
  818. LLVMMetadataRef debug_type = lb_debug_type(m, type);
  819. LLVMMetadataRef var_info = LLVMDIBuilderCreateAutoVariable(
  820. m->debug_builder, llvm_scope,
  821. cast(char const *)name.text, cast(size_t)name.len,
  822. llvm_file, token.pos.line,
  823. debug_type,
  824. always_preserve, flags, alignment_in_bits
  825. );
  826. LLVMValueRef storage = ptr;
  827. LLVMValueRef instr = ptr;
  828. LLVMMetadataRef llvm_debug_loc = lb_debug_location_from_token_pos(p, token.pos);
  829. LLVMMetadataRef llvm_expr = LLVMDIBuilderCreateExpression(m->debug_builder, nullptr, 0);
  830. lb_set_llvm_metadata(m, ptr, llvm_expr);
  831. LLVMDIBuilderInsertDeclareBefore(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, instr);
  832. }
  833. void lb_add_debug_context_variable(lbProcedure *p, lbAddr const &ctx) {
  834. if (!p->debug_info || !p->body) {
  835. return;
  836. }
  837. LLVMMetadataRef loc = LLVMGetCurrentDebugLocation2(p->builder);
  838. if (!loc) {
  839. return;
  840. }
  841. TokenPos pos = {};
  842. pos.file_id = p->body->file ? p->body->file->id : 0;
  843. pos.line = LLVMDILocationGetLine(loc);
  844. pos.column = LLVMDILocationGetColumn(loc);
  845. Token token = {};
  846. token.kind = Token_context;
  847. token.string = str_lit("context");
  848. token.pos = pos;
  849. lb_add_debug_local_variable(p, ctx.addr.value, t_context, token);
  850. }