ruby-llvm 15.0.3 → 15.0.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97fcfaf90ca0b317eef7e65c6b9da2429b0660c6b44f4758a88c4a13e8c5358f
4
- data.tar.gz: ab7fd16b1a16d13992c7e697fba953304d9080869312656a558a5a4c4c3b9880
3
+ metadata.gz: a9606baaed260920d087cafdc03a4524875a11378d9e15792128ec7df9946c7b
4
+ data.tar.gz: 0fba76718a8f7dfd2ee63993eb9ceecb94d0feb75d286997a3dc651ac966ecf7
5
5
  SHA512:
6
- metadata.gz: be57e114f0c66e4cd720526258ccc9e5b0245d6f608d804b3aad877d74a21e8aaecfc74d9b0936cadefc9c4c09ae9feb6ed570b9f264e82ccd700e96386e0e3c
7
- data.tar.gz: 80350a8cc8d9a6a34d338fb167604f1e44f2c7c6ea4aaee760f6fe818af08f90c9e8c750fcdc462f460a9a1137ec30e404ad9e9a5f3591a2ed2c2590b7f61cb6
6
+ metadata.gz: 1c095bf095482f67ca94efc4e36c7d04fb5f82f65b9a483c79239e9bcb91fa4da0f6ed76b77259140a9d17e3a268d77fb05899b59a7469d5d664d808ff8be53a
7
+ data.tar.gz: 88b3dae5b535fdf9d7a6cd0225e3b809b7f54c2d072668516e53a18298953a9d4daa68669e7b01ddb0ddb03a044975828741eecf47b3683f66bfa229e44d3ead
data/lib/llvm/analysis.rb CHANGED
@@ -20,6 +20,10 @@ module LLVM
20
20
  do_verification(:abort_process)
21
21
  end
22
22
 
23
+ def valid?
24
+ verify.nil?
25
+ end
26
+
23
27
  private
24
28
 
25
29
  def do_verification(action)
@@ -42,10 +46,14 @@ module LLVM
42
46
  do_verification(:abort_process)
43
47
  end
44
48
 
49
+ def valid?
50
+ verify
51
+ end
52
+
45
53
  private
46
54
 
47
55
  def do_verification(action)
48
- C.verify_function(self, action) != 0
56
+ C.verify_function(self, action).zero?
49
57
  end
50
58
  end
51
59
  end
@@ -36,6 +36,28 @@ module LLVM
36
36
  end
37
37
  status == 0
38
38
  end
39
+
40
+ def self.parse_ir(path_or_memory_buffer, context = Context.global)
41
+ memory_buffer = case path_or_memory_buffer
42
+ when MemoryBuffer then path_or_memory_buffer
43
+ else MemoryBuffer.from_file(path_or_memory_buffer)
44
+ end
45
+ FFI::MemoryPointer.new(:pointer) do |mod_ref|
46
+ FFI::MemoryPointer.new(:pointer) do |msg_ref|
47
+ status = C.parse_ir_in_context(context, memory_buffer, mod_ref, msg_ref)
48
+ raise msg_ref.get_pointer(0).get_string(0) if status
49
+ return from_ptr(mod_ref.get_pointer(0))
50
+ end
51
+ end
52
+ end
53
+
54
+ def write_ir!(filename)
55
+ FFI::MemoryPointer.new(:pointer) do |msg_ref|
56
+ status = C.print_module_to_file(self, filename, msg_ref)
57
+ raise msg_ref.get_pointer(0).get_string(0) if status != 0
58
+ end
59
+ self
60
+ end
39
61
  end
40
62
 
41
63
  # @private
@@ -563,6 +563,7 @@ module LLVM
563
563
  # @return [LLVM::Instruction] The resulting pointer
564
564
  # @LLVMinst gep
565
565
  # @see http://llvm.org/docs/GetElementPtr.html
566
+ # may return Instruction or GlobalVariable
566
567
  def gep(ptr, indices, name = "")
567
568
  gep2(nil, ptr, indices, name)
568
569
  end
@@ -576,6 +577,7 @@ module LLVM
576
577
  # @return [LLVM::Instruction] The resulting pointer
577
578
  # @LLVMinst gep2
578
579
  # @see http://llvm.org/docs/GetElementPtr.html
580
+ # may return Instruction or GlobalVariable
579
581
  def gep2(type, ptr, indices, name)
580
582
  must_be_value!(ptr)
581
583
 
@@ -24,6 +24,16 @@ module LLVM
24
24
  @ptr = nil
25
25
  end
26
26
 
27
+ def inspect
28
+ {
29
+ triple: triple,
30
+ globals: globals.count,
31
+ functions: functions.count,
32
+ lines: to_s.lines.size,
33
+ valid: valid?,
34
+ }.to_s
35
+ end
36
+
27
37
  # Get module triple.
28
38
  #
29
39
  # @return [String]
@@ -12,6 +12,26 @@ module LLVM
12
12
  val
13
13
  end
14
14
 
15
+ def self.from_ptr_kind(ptr)
16
+ return if ptr.null?
17
+
18
+ kind = C.get_value_kind(ptr)
19
+ case kind
20
+ when :instruction
21
+ Instruction.from_ptr(ptr)
22
+ when :const_int
23
+ Int.from_ptr(ptr)
24
+ when :const_fp
25
+ Float.from_ptr(ptr)
26
+ when :poison
27
+ Poison.from_ptr(ptr)
28
+ when :global_variable
29
+ GlobalValue.from_ptr(ptr)
30
+ else
31
+ raise "from_ptr_kind cannot handle: #{kind}"
32
+ end
33
+ end
34
+
15
35
  # Returns the Value type. This is abstract and is overidden by its subclasses.
16
36
  def self.type
17
37
  raise NotImplementedError, "#{name}.type() is abstract."
@@ -26,6 +46,11 @@ module LLVM
26
46
  Type.from_ptr(C.type_of(self), nil)
27
47
  end
28
48
 
49
+ # Returns the value's kind.
50
+ def kind
51
+ C.get_value_kind(self)
52
+ end
53
+
29
54
  def allocated_type
30
55
  Type.from_ptr(C.get_allocated_type(self), nil)
31
56
  end
@@ -412,22 +437,22 @@ module LLVM
412
437
 
413
438
  # Unsigned division.
414
439
  def udiv(rhs)
415
- self.class.from_ptr(C.const_u_div(self, rhs))
440
+ raise "constant udiv removed in LLVM 15"
416
441
  end
417
442
 
418
443
  # Signed division.
419
444
  def /(rhs)
420
- self.class.from_ptr(C.const_s_div(self, rhs))
445
+ raise "constant sdiv removed in LLVM 15"
421
446
  end
422
447
 
423
448
  # Unsigned remainder.
424
449
  def urem(rhs)
425
- self.class.from_ptr(C.const_u_rem(self, rhs))
450
+ raise "constant urem removed in LLVM 15"
426
451
  end
427
452
 
428
453
  # Signed remainder.
429
454
  def rem(rhs)
430
- self.class.from_ptr(C.const_s_rem(self, rhs))
455
+ raise "constant srem removed in LLVM 15"
431
456
  end
432
457
 
433
458
  # Boolean negation.
@@ -507,6 +532,17 @@ module LLVM
507
532
  def sext(type)
508
533
  self.class.from_ptr(C.const_s_ext(self, type))
509
534
  end
535
+ alias_method :ext, :sext
536
+
537
+ # constant trunc
538
+ def trunc(type)
539
+ self.class.from_ptr(C.const_trunc(self, type))
540
+ end
541
+
542
+ # LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
543
+ def to_f(type)
544
+ self.class.from_ptr(C.const_si_to_fp(self, type))
545
+ end
510
546
  end
511
547
 
512
548
  def self.const_missing(const)
@@ -564,22 +600,22 @@ module LLVM
564
600
 
565
601
  # Returns the result of adding this ConstantReal to rhs.
566
602
  def +(rhs)
567
- self.class.from_ptr(C.const_f_add(self, rhs))
603
+ raise "constant fadd removed in LLVM 15"
568
604
  end
569
605
 
570
606
  # Returns the result of multiplying this ConstantReal by rhs.
571
607
  def *(rhs)
572
- self.class.from_ptr(C.const_f_mul(self, rhs))
608
+ raise "constant fmul removed in LLVM 15"
573
609
  end
574
610
 
575
611
  # Returns the result of dividing this ConstantReal by rhs.
576
612
  def /(rhs)
577
- self.class.from_ptr(C.const_f_div(self, rhs))
613
+ raise "constant fdiv removed in LLVM 15"
578
614
  end
579
615
 
580
616
  # Remainder.
581
617
  def rem(rhs)
582
- self.class.from_ptr(C.const_f_rem(self, rhs))
618
+ raise "constant frem removed in LLVM 15"
583
619
  end
584
620
 
585
621
  # Floating point comparison using the predicate specified via the first
@@ -603,6 +639,24 @@ module LLVM
603
639
  def fcmp(pred, rhs)
604
640
  self.class.from_ptr(C.llmv_const_f_cmp(pred, self, rhs))
605
641
  end
642
+
643
+ # constant FPToSI
644
+ # LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
645
+ def to_i(type)
646
+ self.class.from_ptr(C.const_fp_to_si(self, type))
647
+ end
648
+
649
+ # Constant FPExt
650
+ # this is a signed extension
651
+ def ext(type)
652
+ self.class.from_ptr(C.const_fp_ext(self, type))
653
+ end
654
+ alias_method :sext, :ext
655
+
656
+ def trunc(type)
657
+ self.class.from_ptr(C.const_fp_trunc(self, type))
658
+ end
659
+
606
660
  end
607
661
 
608
662
  class Float < ConstantReal
@@ -939,6 +993,17 @@ module LLVM
939
993
  def gc
940
994
  C.get_gc(self)
941
995
  end
996
+
997
+ def inspect
998
+ {
999
+ signature: to_s.lines[attribute_count == 0 ? 0 : 1],
1000
+ type: type.to_s,
1001
+ attributes: attribute_count,
1002
+ valid: valid?,
1003
+ blocks: basic_blocks.size,
1004
+ lines: to_s.lines.size,
1005
+ }.to_s
1006
+ end
942
1007
  end
943
1008
 
944
1009
  class GlobalAlias < GlobalValue
@@ -966,6 +1031,12 @@ module LLVM
966
1031
  end
967
1032
 
968
1033
  class Instruction < User
1034
+
1035
+ def self.from_ptr(ptr)
1036
+ kind = C.get_value_kind(ptr)
1037
+ kind == :instruction ? super : LLVM::Value.from_ptr_kind(ptr)
1038
+ end
1039
+
969
1040
  # Returns the parent of the instruction (a BasicBlock).
970
1041
  def parent
971
1042
  ptr = C.get_instruction_parent(self)
@@ -987,6 +1058,14 @@ module LLVM
987
1058
  def opcode
988
1059
  C.get_instruction_opcode(self)
989
1060
  end
1061
+
1062
+ def inspect
1063
+ { self.class.name => { opcode: opcode, ptr: @ptr } }.to_s
1064
+ end
1065
+ end
1066
+
1067
+ class Poison < Value
1068
+
990
1069
  end
991
1070
 
992
1071
  class CallInst < Instruction
data/lib/llvm/core.rb CHANGED
@@ -134,6 +134,56 @@ module LLVM
134
134
  # @return [Bool]
135
135
  # @scope class
136
136
  attach_function :is_literal_struct, :LLVMIsLiteralStruct, [:pointer], :bool
137
+
138
+ # /**
139
+ # * Read LLVM IR from a memory buffer and convert it into an in-memory Module
140
+ # * object. Returns 0 on success.
141
+ # * Optionally returns a human-readable description of any errors that
142
+ # * occurred during parsing IR. OutMessage must be disposed with
143
+ # * LLVMDisposeMessage.
144
+ # *
145
+ # * @see llvm::ParseIR()
146
+ # */
147
+ # LLVMBool LLVMParseIRInContext(LLVMContextRef ContextRef,
148
+ # LLVMMemoryBufferRef MemBuf, LLVMModuleRef *OutM,
149
+ # char **OutMessage);
150
+ attach_function :parse_ir_in_context, :LLVMParseIRInContext, [:pointer, :pointer, :pointer, :pointer], :bool
151
+
152
+ enum :value_kind, [
153
+ :argument, 0,
154
+ :basic_block, 1,
155
+ :memory_use, 2,
156
+ :memory_def, 3,
157
+ :memory_phi, 4,
158
+ :function, 5,
159
+ :global_alias, 6,
160
+ :global_ifunc, 7,
161
+ :global_variable, 8,
162
+ :block_address, 9,
163
+ :const_expr, 10,
164
+ :const_array, 11,
165
+ :const_struct, 12,
166
+ :const_vector, 13,
167
+ :undef, 14,
168
+ :const_aggregregate_zero, 15,
169
+ :const_data_array, 16,
170
+ :const_data_vector, 17,
171
+ :const_int, 18,
172
+ :const_fp, 19,
173
+ :const_null, 20,
174
+ :const_none, 21,
175
+ :metadata, 22,
176
+ :inline_asm, 23,
177
+ :instruction, 24,
178
+ :poison, 25,
179
+ ]
180
+
181
+ # /**
182
+ # * Obtain the enumerated type of a Value instance.
183
+ # *
184
+ # * @see llvm::Value::getValueID()
185
+ # */
186
+ attach_function :get_value_kind, :LLVMGetValueKind, [:pointer], :value_kind
137
187
  end
138
188
 
139
189
  # Yields a pointer suitable for storing an LLVM output message.
data/lib/llvm/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  module LLVM
4
4
  LLVM_VERSION = "15"
5
5
  LLVM_REQUIRED_VERSION = "15.0"
6
- RUBY_LLVM_VERSION = "15.0.3"
6
+ RUBY_LLVM_VERSION = "15.0.4"
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-llvm
3
3
  version: !ruby/object:Gem::Version
4
- version: 15.0.3
4
+ version: 15.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Johnson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-02-25 00:00:00.000000000 Z
12
+ date: 2023-05-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi