konpeito 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +75 -0
  4. data/CONTRIBUTING.md +123 -0
  5. data/LICENSE +21 -0
  6. data/README.md +257 -0
  7. data/Rakefile +11 -0
  8. data/bin/konpeito +6 -0
  9. data/konpeito.gemspec +43 -0
  10. data/lib/konpeito/ast/typed_ast.rb +620 -0
  11. data/lib/konpeito/ast/visitor.rb +78 -0
  12. data/lib/konpeito/cache/cache_manager.rb +230 -0
  13. data/lib/konpeito/cache/dependency_graph.rb +192 -0
  14. data/lib/konpeito/cache.rb +8 -0
  15. data/lib/konpeito/cli/base_command.rb +187 -0
  16. data/lib/konpeito/cli/build_command.rb +220 -0
  17. data/lib/konpeito/cli/check_command.rb +104 -0
  18. data/lib/konpeito/cli/config.rb +231 -0
  19. data/lib/konpeito/cli/deps_command.rb +128 -0
  20. data/lib/konpeito/cli/doctor_command.rb +340 -0
  21. data/lib/konpeito/cli/fmt_command.rb +199 -0
  22. data/lib/konpeito/cli/init_command.rb +312 -0
  23. data/lib/konpeito/cli/lsp_command.rb +40 -0
  24. data/lib/konpeito/cli/run_command.rb +150 -0
  25. data/lib/konpeito/cli/test_command.rb +248 -0
  26. data/lib/konpeito/cli/watch_command.rb +212 -0
  27. data/lib/konpeito/cli.rb +301 -0
  28. data/lib/konpeito/codegen/builtin_methods.rb +229 -0
  29. data/lib/konpeito/codegen/cruby_backend.rb +1090 -0
  30. data/lib/konpeito/codegen/debug_info.rb +352 -0
  31. data/lib/konpeito/codegen/inliner.rb +486 -0
  32. data/lib/konpeito/codegen/jvm_backend.rb +197 -0
  33. data/lib/konpeito/codegen/jvm_generator.rb +13412 -0
  34. data/lib/konpeito/codegen/llvm_generator.rb +13191 -0
  35. data/lib/konpeito/codegen/loop_optimizer.rb +363 -0
  36. data/lib/konpeito/codegen/monomorphizer.rb +359 -0
  37. data/lib/konpeito/codegen/profile_runtime.c +341 -0
  38. data/lib/konpeito/codegen/profiler.rb +99 -0
  39. data/lib/konpeito/compiler.rb +592 -0
  40. data/lib/konpeito/dependency_resolver.rb +296 -0
  41. data/lib/konpeito/diagnostics/collector.rb +127 -0
  42. data/lib/konpeito/diagnostics/diagnostic.rb +237 -0
  43. data/lib/konpeito/diagnostics/renderer.rb +144 -0
  44. data/lib/konpeito/formatter/formatter.rb +1214 -0
  45. data/lib/konpeito/hir/builder.rb +7167 -0
  46. data/lib/konpeito/hir/nodes.rb +2465 -0
  47. data/lib/konpeito/lsp/document_manager.rb +820 -0
  48. data/lib/konpeito/lsp/server.rb +183 -0
  49. data/lib/konpeito/lsp/transport.rb +38 -0
  50. data/lib/konpeito/parser/prism_adapter.rb +65 -0
  51. data/lib/konpeito/platform.rb +103 -0
  52. data/lib/konpeito/profile/report.rb +136 -0
  53. data/lib/konpeito/rbs_inline/preprocessor.rb +199 -0
  54. data/lib/konpeito/stdlib/compression/compression.rb +72 -0
  55. data/lib/konpeito/stdlib/compression/compression.rbs +60 -0
  56. data/lib/konpeito/stdlib/compression/compression_native.c +415 -0
  57. data/lib/konpeito/stdlib/compression/extconf.rb +19 -0
  58. data/lib/konpeito/stdlib/crypto/crypto.rb +85 -0
  59. data/lib/konpeito/stdlib/crypto/crypto.rbs +74 -0
  60. data/lib/konpeito/stdlib/crypto/crypto_native.c +312 -0
  61. data/lib/konpeito/stdlib/crypto/extconf.rb +40 -0
  62. data/lib/konpeito/stdlib/http/extconf.rb +19 -0
  63. data/lib/konpeito/stdlib/http/http.rb +125 -0
  64. data/lib/konpeito/stdlib/http/http.rbs +57 -0
  65. data/lib/konpeito/stdlib/http/http_native.c +440 -0
  66. data/lib/konpeito/stdlib/json/extconf.rb +17 -0
  67. data/lib/konpeito/stdlib/json/json.rb +44 -0
  68. data/lib/konpeito/stdlib/json/json.rbs +33 -0
  69. data/lib/konpeito/stdlib/json/json_native.c +286 -0
  70. data/lib/konpeito/stdlib/ui/extconf.rb +216 -0
  71. data/lib/konpeito/stdlib/ui/konpeito_ui_native.cpp +1625 -0
  72. data/lib/konpeito/stdlib/ui/konpeito_ui_native.h +162 -0
  73. data/lib/konpeito/stdlib/ui/ui.rb +318 -0
  74. data/lib/konpeito/stdlib/ui/ui.rbs +247 -0
  75. data/lib/konpeito/type_checker/annotation_parser.rb +67 -0
  76. data/lib/konpeito/type_checker/hm_inferrer.rb +2565 -0
  77. data/lib/konpeito/type_checker/inferrer.rb +565 -0
  78. data/lib/konpeito/type_checker/rbs_loader.rb +1621 -0
  79. data/lib/konpeito/type_checker/type_resolver.rb +276 -0
  80. data/lib/konpeito/type_checker/types.rb +1434 -0
  81. data/lib/konpeito/type_checker/unification.rb +323 -0
  82. data/lib/konpeito/ui/animation/animated_state.rb +80 -0
  83. data/lib/konpeito/ui/animation/easing.rb +59 -0
  84. data/lib/konpeito/ui/animation/value_tween.rb +66 -0
  85. data/lib/konpeito/ui/app.rb +379 -0
  86. data/lib/konpeito/ui/box.rb +38 -0
  87. data/lib/konpeito/ui/castella.rb +70 -0
  88. data/lib/konpeito/ui/castella_native.rb +76 -0
  89. data/lib/konpeito/ui/chart/area_chart.rb +305 -0
  90. data/lib/konpeito/ui/chart/bar_chart.rb +288 -0
  91. data/lib/konpeito/ui/chart/base_chart.rb +210 -0
  92. data/lib/konpeito/ui/chart/chart_helpers.rb +79 -0
  93. data/lib/konpeito/ui/chart/gauge_chart.rb +171 -0
  94. data/lib/konpeito/ui/chart/heatmap_chart.rb +222 -0
  95. data/lib/konpeito/ui/chart/line_chart.rb +289 -0
  96. data/lib/konpeito/ui/chart/pie_chart.rb +219 -0
  97. data/lib/konpeito/ui/chart/scales.rb +77 -0
  98. data/lib/konpeito/ui/chart/scatter_chart.rb +303 -0
  99. data/lib/konpeito/ui/chart/stacked_bar_chart.rb +276 -0
  100. data/lib/konpeito/ui/column.rb +271 -0
  101. data/lib/konpeito/ui/core.rb +2199 -0
  102. data/lib/konpeito/ui/dsl.rb +443 -0
  103. data/lib/konpeito/ui/frame.rb +171 -0
  104. data/lib/konpeito/ui/frame_native.rb +494 -0
  105. data/lib/konpeito/ui/markdown/ast.rb +124 -0
  106. data/lib/konpeito/ui/markdown/mermaid/layout.rb +387 -0
  107. data/lib/konpeito/ui/markdown/mermaid/models.rb +232 -0
  108. data/lib/konpeito/ui/markdown/mermaid/parser.rb +519 -0
  109. data/lib/konpeito/ui/markdown/mermaid/renderer.rb +336 -0
  110. data/lib/konpeito/ui/markdown/parser.rb +805 -0
  111. data/lib/konpeito/ui/markdown/renderer.rb +639 -0
  112. data/lib/konpeito/ui/markdown/theme.rb +165 -0
  113. data/lib/konpeito/ui/render_node.rb +260 -0
  114. data/lib/konpeito/ui/row.rb +207 -0
  115. data/lib/konpeito/ui/spacer.rb +18 -0
  116. data/lib/konpeito/ui/style.rb +799 -0
  117. data/lib/konpeito/ui/theme.rb +563 -0
  118. data/lib/konpeito/ui/themes/material.rb +35 -0
  119. data/lib/konpeito/ui/themes/tokyo_night.rb +6 -0
  120. data/lib/konpeito/ui/widgets/button.rb +103 -0
  121. data/lib/konpeito/ui/widgets/calendar.rb +1034 -0
  122. data/lib/konpeito/ui/widgets/checkbox.rb +119 -0
  123. data/lib/konpeito/ui/widgets/container.rb +91 -0
  124. data/lib/konpeito/ui/widgets/data_table.rb +667 -0
  125. data/lib/konpeito/ui/widgets/divider.rb +29 -0
  126. data/lib/konpeito/ui/widgets/image.rb +105 -0
  127. data/lib/konpeito/ui/widgets/input.rb +485 -0
  128. data/lib/konpeito/ui/widgets/markdown.rb +57 -0
  129. data/lib/konpeito/ui/widgets/modal.rb +163 -0
  130. data/lib/konpeito/ui/widgets/multiline_input.rb +968 -0
  131. data/lib/konpeito/ui/widgets/multiline_text.rb +180 -0
  132. data/lib/konpeito/ui/widgets/net_image.rb +100 -0
  133. data/lib/konpeito/ui/widgets/progress_bar.rb +70 -0
  134. data/lib/konpeito/ui/widgets/radio_buttons.rb +93 -0
  135. data/lib/konpeito/ui/widgets/slider.rb +133 -0
  136. data/lib/konpeito/ui/widgets/switch.rb +84 -0
  137. data/lib/konpeito/ui/widgets/tabs.rb +157 -0
  138. data/lib/konpeito/ui/widgets/text.rb +110 -0
  139. data/lib/konpeito/ui/widgets/tree.rb +426 -0
  140. data/lib/konpeito/version.rb +5 -0
  141. data/lib/konpeito.rb +109 -0
  142. data/test_native_array.rb +172 -0
  143. data/test_native_array_class.rb +197 -0
  144. data/test_native_class.rb +151 -0
  145. data/tools/konpeito-asm/build.sh +65 -0
  146. data/tools/konpeito-asm/lib/asm-9.7.1.jar +0 -0
  147. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KArray.class +0 -0
  148. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KCompression.class +0 -0
  149. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KConditionVariable.class +0 -0
  150. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KCrypto.class +0 -0
  151. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KFile.class +0 -0
  152. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KHTTP.class +0 -0
  153. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KHash.class +0 -0
  154. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KJSON$Parser.class +0 -0
  155. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KJSON.class +0 -0
  156. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KMath.class +0 -0
  157. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KRactor.class +0 -0
  158. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KRactorPort.class +0 -0
  159. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KSizedQueue.class +0 -0
  160. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KThread.class +0 -0
  161. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KTime.class +0 -0
  162. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/RubyDispatch.class +0 -0
  163. data/tools/konpeito-asm/src/ClassIntrospector.java +312 -0
  164. data/tools/konpeito-asm/src/KonpeitoAssembler.java +659 -0
  165. data/tools/konpeito-asm/src/konpeito/runtime/KArray.java +390 -0
  166. data/tools/konpeito-asm/src/konpeito/runtime/KCompression.java +168 -0
  167. data/tools/konpeito-asm/src/konpeito/runtime/KConditionVariable.java +48 -0
  168. data/tools/konpeito-asm/src/konpeito/runtime/KCrypto.java +151 -0
  169. data/tools/konpeito-asm/src/konpeito/runtime/KFile.java +100 -0
  170. data/tools/konpeito-asm/src/konpeito/runtime/KHTTP.java +113 -0
  171. data/tools/konpeito-asm/src/konpeito/runtime/KHash.java +228 -0
  172. data/tools/konpeito-asm/src/konpeito/runtime/KJSON.java +405 -0
  173. data/tools/konpeito-asm/src/konpeito/runtime/KMath.java +54 -0
  174. data/tools/konpeito-asm/src/konpeito/runtime/KRactor.java +244 -0
  175. data/tools/konpeito-asm/src/konpeito/runtime/KRactorPort.java +53 -0
  176. data/tools/konpeito-asm/src/konpeito/runtime/KSizedQueue.java +49 -0
  177. data/tools/konpeito-asm/src/konpeito/runtime/KThread.java +49 -0
  178. data/tools/konpeito-asm/src/konpeito/runtime/KTime.java +53 -0
  179. data/tools/konpeito-asm/src/konpeito/runtime/RubyDispatch.java +416 -0
  180. metadata +267 -0
@@ -0,0 +1,352 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ffi"
4
+
5
+ module Konpeito
6
+ module Codegen
7
+ # FFI bindings for LLVM Debug Info C API
8
+ module DebugInfoFFI
9
+ extend FFI::Library
10
+
11
+ # Load LLVM library
12
+ begin
13
+ ffi_lib(Konpeito::Platform.find_llvm_lib || "LLVM-20")
14
+ rescue LoadError
15
+ ffi_lib "LLVM-20"
16
+ end
17
+
18
+ # DWARF source language enum
19
+ DWARF_SOURCE_LANGUAGE_RUBY = 56 # LLVMDWARFSourceLanguageRuby
20
+
21
+ # DI Flags
22
+ DI_FLAG_ZERO = 0
23
+
24
+ # DIBuilder functions
25
+ attach_function :LLVMCreateDIBuilder, [:pointer], :pointer
26
+ attach_function :LLVMDisposeDIBuilder, [:pointer], :void
27
+ attach_function :LLVMDIBuilderFinalize, [:pointer], :void
28
+
29
+ # Create compile unit
30
+ attach_function :LLVMDIBuilderCreateCompileUnit, [
31
+ :pointer, # Builder
32
+ :uint, # Language
33
+ :pointer, # FileRef
34
+ :string, # Producer
35
+ :size_t, # ProducerLen
36
+ :int, # isOptimized
37
+ :string, # Flags
38
+ :size_t, # FlagsLen
39
+ :uint, # RuntimeVer
40
+ :string, # SplitName
41
+ :size_t, # SplitNameLen
42
+ :uint, # Kind (DWARFEmissionKind)
43
+ :uint, # DWOId
44
+ :int, # SplitDebugInlining
45
+ :int, # DebugInfoForProfiling
46
+ :string, # SysRoot
47
+ :size_t, # SysRootLen
48
+ :string, # SDK
49
+ :size_t # SDKLen
50
+ ], :pointer
51
+
52
+ # Create file
53
+ attach_function :LLVMDIBuilderCreateFile, [
54
+ :pointer, # Builder
55
+ :string, # Filename
56
+ :size_t, # FilenameLen
57
+ :string, # Directory
58
+ :size_t # DirectoryLen
59
+ ], :pointer
60
+
61
+ # Create function (subprogram)
62
+ attach_function :LLVMDIBuilderCreateFunction, [
63
+ :pointer, # Builder
64
+ :pointer, # Scope
65
+ :string, # Name
66
+ :size_t, # NameLen
67
+ :string, # LinkageName
68
+ :size_t, # LinkageNameLen
69
+ :pointer, # File
70
+ :uint, # LineNo
71
+ :pointer, # Ty (subroutine type)
72
+ :int, # IsLocalToUnit
73
+ :int, # IsDefinition
74
+ :uint, # ScopeLine
75
+ :uint, # Flags
76
+ :int # IsOptimized
77
+ ], :pointer
78
+
79
+ # Create subroutine type
80
+ attach_function :LLVMDIBuilderCreateSubroutineType, [
81
+ :pointer, # Builder
82
+ :pointer, # File
83
+ :pointer, # ParameterTypes array
84
+ :uint, # NumParameterTypes
85
+ :uint # Flags
86
+ ], :pointer
87
+
88
+ # Create basic type
89
+ attach_function :LLVMDIBuilderCreateBasicType, [
90
+ :pointer, # Builder
91
+ :string, # Name
92
+ :size_t, # NameLen
93
+ :uint64, # SizeInBits
94
+ :uint, # Encoding
95
+ :uint # Flags
96
+ ], :pointer
97
+
98
+ # Create debug location
99
+ attach_function :LLVMDIBuilderCreateDebugLocation, [
100
+ :pointer, # Context
101
+ :uint, # Line
102
+ :uint, # Column
103
+ :pointer, # Scope
104
+ :pointer # InlinedAt
105
+ ], :pointer
106
+
107
+ # Create auto variable (local variable)
108
+ attach_function :LLVMDIBuilderCreateAutoVariable, [
109
+ :pointer, # Builder
110
+ :pointer, # Scope
111
+ :string, # Name
112
+ :size_t, # NameLen
113
+ :pointer, # File
114
+ :uint, # LineNo
115
+ :pointer, # Ty
116
+ :int, # AlwaysPreserve
117
+ :uint, # Flags
118
+ :uint # AlignInBits
119
+ ], :pointer
120
+
121
+ # Create parameter variable
122
+ attach_function :LLVMDIBuilderCreateParameterVariable, [
123
+ :pointer, # Builder
124
+ :pointer, # Scope
125
+ :string, # Name
126
+ :size_t, # NameLen
127
+ :uint, # ArgNo
128
+ :pointer, # File
129
+ :uint, # LineNo
130
+ :pointer, # Ty
131
+ :int, # AlwaysPreserve
132
+ :uint # Flags
133
+ ], :pointer
134
+
135
+ # Insert declare record (for alloca) - LLVM 20+
136
+ attach_function :LLVMDIBuilderInsertDeclareRecordAtEnd, [
137
+ :pointer, # Builder
138
+ :pointer, # Storage (alloca)
139
+ :pointer, # VarInfo
140
+ :pointer, # Expr
141
+ :pointer, # DebugLoc
142
+ :pointer # Block (BasicBlock)
143
+ ], :pointer
144
+
145
+ # Create expression
146
+ attach_function :LLVMDIBuilderCreateExpression, [
147
+ :pointer, # Builder
148
+ :pointer, # Addr array
149
+ :size_t # Length
150
+ ], :pointer
151
+
152
+ # Set subprogram
153
+ attach_function :LLVMSetSubprogram, [:pointer, :pointer], :void
154
+
155
+ # Get/Set current debug location
156
+ attach_function :LLVMSetCurrentDebugLocation2, [:pointer, :pointer], :void
157
+ attach_function :LLVMGetCurrentDebugLocation2, [:pointer], :pointer
158
+
159
+ # Metadata kind
160
+ attach_function :LLVMGetMDKindIDInContext, [:pointer, :string, :uint], :uint
161
+
162
+ # Type array
163
+ attach_function :LLVMDIBuilderGetOrCreateTypeArray, [
164
+ :pointer, # Builder
165
+ :pointer, # Data array
166
+ :size_t # NumElements
167
+ ], :pointer
168
+
169
+ # Module flags for DWARF version
170
+ attach_function :LLVMAddModuleFlag, [
171
+ :pointer, # Module
172
+ :int, # Behavior (LLVMModuleFlagBehaviorWarning = 1)
173
+ :string, # Key
174
+ :size_t, # KeyLen
175
+ :pointer # Val (Metadata)
176
+ ], :void
177
+
178
+ # Convert value to metadata
179
+ attach_function :LLVMValueAsMetadata, [:pointer], :pointer
180
+
181
+ # Create constant int
182
+ attach_function :LLVMConstInt, [:pointer, :ulong_long, :int], :pointer
183
+
184
+ # Get int types
185
+ attach_function :LLVMInt32TypeInContext, [:pointer], :pointer
186
+
187
+ # Get module context
188
+ attach_function :LLVMGetModuleContext, [:pointer], :pointer
189
+ end
190
+
191
+ # High-level wrapper for DIBuilder
192
+ class DIBuilder
193
+ attr_reader :builder, :file, :compile_unit
194
+
195
+ DWARF_VERSION = 4
196
+ DEBUG_INFO_VERSION = 3 # LLVM debug info version
197
+
198
+ def initialize(llvm_module)
199
+ @llvm_module = llvm_module
200
+ @builder = DebugInfoFFI.LLVMCreateDIBuilder(llvm_module.to_ptr)
201
+ @file = nil
202
+ @compile_unit = nil
203
+ @types = {}
204
+
205
+ # Set module flags for DWARF
206
+ set_module_debug_flags
207
+ end
208
+
209
+ # Set module flags required for DWARF debug info
210
+ def set_module_debug_flags
211
+ mod_ptr = @llvm_module.to_ptr
212
+ ctx = DebugInfoFFI.LLVMGetModuleContext(mod_ptr)
213
+ i32_type = DebugInfoFFI.LLVMInt32TypeInContext(ctx)
214
+
215
+ # Add "Dwarf Version" flag
216
+ dwarf_val = DebugInfoFFI.LLVMConstInt(i32_type, DWARF_VERSION, 0)
217
+ dwarf_md = DebugInfoFFI.LLVMValueAsMetadata(dwarf_val)
218
+ key = "Dwarf Version"
219
+ DebugInfoFFI.LLVMAddModuleFlag(mod_ptr, 1, key, key.length, dwarf_md)
220
+
221
+ # Add "Debug Info Version" flag
222
+ debug_val = DebugInfoFFI.LLVMConstInt(i32_type, DEBUG_INFO_VERSION, 0)
223
+ debug_md = DebugInfoFFI.LLVMValueAsMetadata(debug_val)
224
+ key2 = "Debug Info Version"
225
+ DebugInfoFFI.LLVMAddModuleFlag(mod_ptr, 1, key2, key2.length, debug_md)
226
+ end
227
+
228
+ def create_compile_unit(filename:, directory:, producer: "konpeito")
229
+ @file = DebugInfoFFI.LLVMDIBuilderCreateFile(
230
+ @builder,
231
+ filename, filename.length,
232
+ directory, directory.length
233
+ )
234
+
235
+ @compile_unit = DebugInfoFFI.LLVMDIBuilderCreateCompileUnit(
236
+ @builder,
237
+ DebugInfoFFI::DWARF_SOURCE_LANGUAGE_RUBY,
238
+ @file,
239
+ producer, producer.length,
240
+ 0, # isOptimized
241
+ "", 0, # Flags
242
+ 0, # RuntimeVer
243
+ nil, 0, # SplitName
244
+ 1, # DWARFEmissionKind::FullDebug
245
+ 0, # DWOId
246
+ 0, # SplitDebugInlining
247
+ 0, # DebugInfoForProfiling
248
+ nil, 0, # SysRoot
249
+ nil, 0 # SDK
250
+ )
251
+ end
252
+
253
+ def create_function(name:, linkage_name: nil, line:, scope: nil)
254
+ linkage_name ||= name
255
+ scope ||= @compile_unit
256
+
257
+ # Create subroutine type (void for now)
258
+ type_array_ptr = FFI::MemoryPointer.new(:pointer, 1)
259
+ type_array_ptr.put_pointer(0, nil) # void return type
260
+ subroutine_type = DebugInfoFFI.LLVMDIBuilderCreateSubroutineType(
261
+ @builder,
262
+ @file,
263
+ type_array_ptr,
264
+ 0,
265
+ DebugInfoFFI::DI_FLAG_ZERO
266
+ )
267
+
268
+ DebugInfoFFI.LLVMDIBuilderCreateFunction(
269
+ @builder,
270
+ scope,
271
+ name, name.length,
272
+ linkage_name, linkage_name.length,
273
+ @file,
274
+ line,
275
+ subroutine_type,
276
+ 1, # IsLocalToUnit
277
+ 1, # IsDefinition
278
+ line, # ScopeLine
279
+ DebugInfoFFI::DI_FLAG_ZERO,
280
+ 0 # IsOptimized
281
+ )
282
+ end
283
+
284
+ def create_debug_location(context, line:, column:, scope:)
285
+ DebugInfoFFI.LLVMDIBuilderCreateDebugLocation(
286
+ context,
287
+ line,
288
+ column,
289
+ scope,
290
+ nil # InlinedAt
291
+ )
292
+ end
293
+
294
+ def set_location(builder, location)
295
+ DebugInfoFFI.LLVMSetCurrentDebugLocation2(builder.to_ptr, location)
296
+ end
297
+
298
+ def attach_subprogram(function, subprogram)
299
+ DebugInfoFFI.LLVMSetSubprogram(function.to_ptr, subprogram)
300
+ end
301
+
302
+ def create_basic_type(name:, size_bits:, encoding:)
303
+ @types[name] ||= DebugInfoFFI.LLVMDIBuilderCreateBasicType(
304
+ @builder,
305
+ name, name.length,
306
+ size_bits,
307
+ encoding,
308
+ DebugInfoFFI::DI_FLAG_ZERO
309
+ )
310
+ end
311
+
312
+ def create_empty_expression
313
+ DebugInfoFFI.LLVMDIBuilderCreateExpression(@builder, nil, 0)
314
+ end
315
+
316
+ def create_auto_variable(name:, scope:, line:, type:)
317
+ DebugInfoFFI.LLVMDIBuilderCreateAutoVariable(
318
+ @builder,
319
+ scope,
320
+ name, name.length,
321
+ @file,
322
+ line,
323
+ type,
324
+ 1, # AlwaysPreserve
325
+ DebugInfoFFI::DI_FLAG_ZERO,
326
+ 0 # AlignInBits
327
+ )
328
+ end
329
+
330
+ def insert_declare(storage:, var_info:, location:, block:)
331
+ expr = create_empty_expression
332
+ DebugInfoFFI.LLVMDIBuilderInsertDeclareRecordAtEnd(
333
+ @builder,
334
+ storage.to_ptr,
335
+ var_info,
336
+ expr,
337
+ location,
338
+ block.to_ptr
339
+ )
340
+ end
341
+
342
+ def finalize
343
+ DebugInfoFFI.LLVMDIBuilderFinalize(@builder)
344
+ end
345
+
346
+ def dispose
347
+ DebugInfoFFI.LLVMDisposeDIBuilder(@builder)
348
+ @builder = nil
349
+ end
350
+ end
351
+ end
352
+ end