llvm_backend_debug.cpp 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238
  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(bt);
  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, lbArgKind arg_kind) {
  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. switch (arg_kind) {
  926. case lbArg_Direct:
  927. LLVMDIBuilderInsertDbgValueAtEnd(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, block->block);
  928. break;
  929. case lbArg_Indirect:
  930. LLVMDIBuilderInsertDeclareAtEnd(m->debug_builder, storage, var_info, llvm_expr, llvm_debug_loc, block->block);
  931. break;
  932. }
  933. }
  934. gb_internal void lb_add_debug_context_variable(lbProcedure *p, lbAddr const &ctx) {
  935. if (!p->debug_info || !p->body) {
  936. return;
  937. }
  938. LLVMMetadataRef loc = LLVMGetCurrentDebugLocation2(p->builder);
  939. if (!loc) {
  940. return;
  941. }
  942. TokenPos pos = {};
  943. pos.file_id = p->body->file_id;
  944. pos.line = LLVMDILocationGetLine(loc);
  945. pos.column = LLVMDILocationGetColumn(loc);
  946. Token token = {};
  947. token.kind = Token_context;
  948. token.string = str_lit("context");
  949. token.pos = pos;
  950. LLVMValueRef ptr = ctx.addr.value;
  951. while (LLVMIsABitCastInst(ptr)) {
  952. ptr = LLVMGetOperand(ptr, 0);
  953. }
  954. lb_add_debug_local_variable(p, ptr, t_context, token);
  955. }
  956. gb_internal String debug_info_mangle_constant_name(Entity *e, gbAllocator const &allocator, bool *did_allocate_) {
  957. String name = e->token.string;
  958. if (e->pkg && e->pkg->name.len > 0) {
  959. // NOTE(bill): C++ NONSENSE FOR DEBUG SHITE!
  960. name = concatenate3_strings(allocator, e->pkg->name, str_lit("::"), name);
  961. if (did_allocate_) *did_allocate_ = true;
  962. }
  963. return name;
  964. }
  965. gb_internal void add_debug_info_global_variable_expr(lbModule *m, String const &name, LLVMMetadataRef dtype, LLVMMetadataRef expr) {
  966. LLVMMetadataRef scope = nullptr;
  967. LLVMMetadataRef file = nullptr;
  968. unsigned line = 0;
  969. LLVMMetadataRef decl = nullptr;
  970. LLVMDIBuilderCreateGlobalVariableExpression(
  971. m->debug_builder, scope,
  972. cast(char const *)name.text, cast(size_t)name.len,
  973. "", 0, // Linkage
  974. file, line, dtype,
  975. false, // local to unit
  976. expr, decl, 8/*AlignInBits*/);
  977. }
  978. gb_internal void add_debug_info_for_global_constant_internal_i64(lbModule *m, Entity *e, LLVMMetadataRef dtype, i64 v) {
  979. LLVMMetadataRef expr = LLVMDIBuilderCreateConstantValueExpression(m->debug_builder, v);
  980. TEMPORARY_ALLOCATOR_GUARD();
  981. String name = debug_info_mangle_constant_name(e, temporary_allocator(), nullptr);
  982. add_debug_info_global_variable_expr(m, name, dtype, expr);
  983. if ((e->pkg && e->pkg->kind == Package_Init) ||
  984. (e->scope && (e->scope->flags & ScopeFlag_Global))) {
  985. add_debug_info_global_variable_expr(m, e->token.string, dtype, expr);
  986. }
  987. }
  988. gb_internal void add_debug_info_for_global_constant_from_entity(lbGenerator *gen, Entity *e) {
  989. if (e == nullptr || e->kind != Entity_Constant) {
  990. return;
  991. }
  992. if (is_blank_ident(e->token)) {
  993. return;
  994. }
  995. lbModule *m = &gen->default_module;
  996. if (USE_SEPARATE_MODULES) {
  997. m = lb_module_of_entity(gen, e);
  998. }
  999. if (is_type_integer(e->type)) {
  1000. ExactValue const &value = e->Constant.value;
  1001. if (value.kind == ExactValue_Integer) {
  1002. LLVMMetadataRef dtype = nullptr;
  1003. i64 v = 0;
  1004. bool is_signed = false;
  1005. if (big_int_is_neg(&value.value_integer)) {
  1006. v = exact_value_to_i64(value);
  1007. is_signed = true;
  1008. } else {
  1009. v = cast(i64)exact_value_to_u64(value);
  1010. }
  1011. if (is_type_untyped(e->type)) {
  1012. dtype = lb_debug_type(m, is_signed ? t_i64 : t_u64);
  1013. } else {
  1014. dtype = lb_debug_type(m, e->type);
  1015. }
  1016. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1017. }
  1018. } else if (is_type_rune(e->type)) {
  1019. ExactValue const &value = e->Constant.value;
  1020. if (value.kind == ExactValue_Integer) {
  1021. LLVMMetadataRef dtype = lb_debug_type(m, t_rune);
  1022. i64 v = exact_value_to_i64(value);
  1023. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1024. }
  1025. } else if (is_type_boolean(e->type)) {
  1026. ExactValue const &value = e->Constant.value;
  1027. if (value.kind == ExactValue_Bool) {
  1028. LLVMMetadataRef dtype = lb_debug_type(m, default_type(e->type));
  1029. i64 v = cast(i64)value.value_bool;
  1030. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1031. }
  1032. } else if (is_type_enum(e->type)) {
  1033. ExactValue const &value = e->Constant.value;
  1034. if (value.kind == ExactValue_Integer) {
  1035. LLVMMetadataRef dtype = lb_debug_type(m, default_type(e->type));
  1036. i64 v = 0;
  1037. if (big_int_is_neg(&value.value_integer)) {
  1038. v = exact_value_to_i64(value);
  1039. } else {
  1040. v = cast(i64)exact_value_to_u64(value);
  1041. }
  1042. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1043. }
  1044. } else if (is_type_pointer(e->type)) {
  1045. ExactValue const &value = e->Constant.value;
  1046. if (value.kind == ExactValue_Integer) {
  1047. LLVMMetadataRef dtype = lb_debug_type(m, default_type(e->type));
  1048. i64 v = cast(i64)exact_value_to_u64(value);
  1049. add_debug_info_for_global_constant_internal_i64(m, e, dtype, v);
  1050. }
  1051. }
  1052. }