llvm_backend_debug.cpp 44 KB

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