ruby-llvm 15.0.2 → 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 +4 -4
- data/lib/llvm/analysis.rb +9 -1
- data/lib/llvm/core/bitcode.rb +22 -0
- data/lib/llvm/core/builder.rb +2 -0
- data/lib/llvm/core/module.rb +10 -0
- data/lib/llvm/core/pass_manager.rb +5 -0
- data/lib/llvm/core/value.rb +87 -8
- data/lib/llvm/core.rb +50 -0
- data/lib/llvm/transforms/ipo.rb +48 -4
- data/lib/llvm/transforms/ipo_ffi.rb +0 -16
- data/lib/llvm/transforms/scalar.rb +177 -15
- data/lib/llvm/transforms/scalar_ffi.rb +0 -24
- data/lib/llvm/transforms/utils.rb +34 -0
- data/lib/llvm/transforms/vectorize.rb +6 -1
- data/lib/llvm/version.rb +1 -1
- metadata +3 -3
- data/lib/llvm/core/opaque_pointer_builder.rb +0 -26
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a9606baaed260920d087cafdc03a4524875a11378d9e15792128ec7df9946c7b
|
|
4
|
+
data.tar.gz: 0fba76718a8f7dfd2ee63993eb9ceecb94d0feb75d286997a3dc651ac966ecf7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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)
|
|
56
|
+
C.verify_function(self, action).zero?
|
|
49
57
|
end
|
|
50
58
|
end
|
|
51
59
|
end
|
data/lib/llvm/core/bitcode.rb
CHANGED
|
@@ -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
|
data/lib/llvm/core/builder.rb
CHANGED
|
@@ -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
|
|
data/lib/llvm/core/module.rb
CHANGED
|
@@ -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]
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "llvm/transforms/ipo"
|
|
4
|
+
require "llvm/transforms/scalar"
|
|
5
|
+
require "llvm/transforms/utils"
|
|
6
|
+
require "llvm/transforms/vectorize"
|
|
7
|
+
|
|
3
8
|
module LLVM
|
|
4
9
|
# The PassManager runs a queue of passes on a module. See
|
|
5
10
|
# http://llvm.org/docs/Passes.html for the list of available passes.
|
data/lib/llvm/core/value.rb
CHANGED
|
@@ -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
|
-
|
|
440
|
+
raise "constant udiv removed in LLVM 15"
|
|
416
441
|
end
|
|
417
442
|
|
|
418
443
|
# Signed division.
|
|
419
444
|
def /(rhs)
|
|
420
|
-
|
|
445
|
+
raise "constant sdiv removed in LLVM 15"
|
|
421
446
|
end
|
|
422
447
|
|
|
423
448
|
# Unsigned remainder.
|
|
424
449
|
def urem(rhs)
|
|
425
|
-
|
|
450
|
+
raise "constant urem removed in LLVM 15"
|
|
426
451
|
end
|
|
427
452
|
|
|
428
453
|
# Signed remainder.
|
|
429
454
|
def rem(rhs)
|
|
430
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
613
|
+
raise "constant fdiv removed in LLVM 15"
|
|
578
614
|
end
|
|
579
615
|
|
|
580
616
|
# Remainder.
|
|
581
617
|
def rem(rhs)
|
|
582
|
-
|
|
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/transforms/ipo.rb
CHANGED
|
@@ -9,72 +9,116 @@ module LLVM
|
|
|
9
9
|
class PassManager
|
|
10
10
|
# @LLVMpass arg_promotion
|
|
11
11
|
def arg_promote!
|
|
12
|
-
|
|
12
|
+
warn('arg_promote! / LLVMAddArgumentPromotionPass was removed from LLVM')
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
# @LLVMpass const_merge
|
|
16
|
+
# /** See llvm::createConstantMergePass function. */
|
|
17
|
+
# void LLVMAddConstantMergePass(LLVMPassManagerRef PM);
|
|
16
18
|
def const_merge!
|
|
17
19
|
C.add_constant_merge_pass(self)
|
|
18
20
|
end
|
|
19
21
|
|
|
22
|
+
# @LLVMpass mergefunc
|
|
23
|
+
# /** See llvm::createMergeFunctionsPass function. */
|
|
24
|
+
# void LLVMAddMergeFunctionsPass(LLVMPassManagerRef PM);
|
|
25
|
+
def mergefunc!
|
|
26
|
+
C.add_merge_functions_pass(self)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @LLVMpass called-value-propagation
|
|
30
|
+
# /** See llvm::createCalledValuePropagationPass function. */
|
|
31
|
+
# void LLVMAddCalledValuePropagationPass(LLVMPassManagerRef PM);
|
|
32
|
+
def called_value_propagation!
|
|
33
|
+
C.add_called_value_propagation_pass(self)
|
|
34
|
+
end
|
|
35
|
+
|
|
20
36
|
# @LLVMpass dae
|
|
37
|
+
# /** See llvm::createDeadArgEliminationPass function. */
|
|
38
|
+
# void LLVMAddDeadArgEliminationPass(LLVMPassManagerRef PM);
|
|
21
39
|
def dae!
|
|
22
|
-
C.
|
|
40
|
+
C.add_dead_arg_elimination_pass(self)
|
|
23
41
|
end
|
|
24
42
|
|
|
25
43
|
# @LLVMpass function_attrs
|
|
44
|
+
# /** See llvm::createFunctionAttrsPass function. */
|
|
45
|
+
# void LLVMAddFunctionAttrsPass(LLVMPassManagerRef PM);
|
|
26
46
|
def fun_attrs!
|
|
27
47
|
C.add_function_attrs_pass(self)
|
|
28
48
|
end
|
|
29
49
|
|
|
30
50
|
# @LLVMpass inline
|
|
51
|
+
# /** See llvm::createFunctionInliningPass function. */
|
|
52
|
+
# void LLVMAddFunctionInliningPass(LLVMPassManagerRef PM);
|
|
31
53
|
def inline!
|
|
32
54
|
C.add_function_inlining_pass(self)
|
|
33
55
|
end
|
|
34
56
|
|
|
35
57
|
# @LLVMpass always_inline
|
|
58
|
+
# /** See llvm::createAlwaysInlinerPass function. */
|
|
59
|
+
# void LLVMAddAlwaysInlinerPass(LLVMPassManagerRef PM);
|
|
36
60
|
def always_inline!
|
|
37
61
|
C.add_always_inliner_pass(self)
|
|
38
62
|
end
|
|
39
63
|
|
|
40
64
|
# @LLVMpass gdce
|
|
65
|
+
# /** See llvm::createGlobalDCEPass function. */
|
|
66
|
+
# void LLVMAddGlobalDCEPass(LLVMPassManagerRef PM);
|
|
41
67
|
def gdce!
|
|
42
68
|
C.add_global_dce_pass(self)
|
|
43
69
|
end
|
|
44
70
|
|
|
45
71
|
# @LLVMpass global_opt
|
|
72
|
+
# /** See llvm::createGlobalOptimizerPass function. */
|
|
73
|
+
# void LLVMAddGlobalOptimizerPass(LLVMPassManagerRef PM);
|
|
46
74
|
def global_opt!
|
|
47
75
|
C.add_global_optimizer_pass(self)
|
|
48
76
|
end
|
|
49
77
|
|
|
50
78
|
# @LLVMpass ipcp
|
|
51
79
|
def ipcp!
|
|
52
|
-
|
|
80
|
+
warn('ipcp! / LLVMAddIPConstantPropagationPass was removed from LLVM')
|
|
53
81
|
end
|
|
54
82
|
|
|
55
83
|
# @LLVMpass prune_eh
|
|
84
|
+
# /** See llvm::createPruneEHPass function. */
|
|
85
|
+
# void LLVMAddPruneEHPass(LLVMPassManagerRef PM);
|
|
56
86
|
def prune_eh!
|
|
57
87
|
C.add_prune_eh_pass(self)
|
|
58
88
|
end
|
|
59
89
|
|
|
60
90
|
# @LLVMpass ipsccp
|
|
91
|
+
# /** See llvm::createIPSCCPPass function. */
|
|
92
|
+
# void LLVMAddIPSCCPPass(LLVMPassManagerRef PM);
|
|
61
93
|
def ipsccp!
|
|
62
94
|
C.add_ipsccp_pass(self)
|
|
63
95
|
end
|
|
64
96
|
|
|
65
97
|
# @LLVMpass internalize
|
|
98
|
+
# /** See llvm::createInternalizePass function. */
|
|
99
|
+
# void LLVMAddInternalizePass(LLVMPassManagerRef, unsigned AllButMain);
|
|
66
100
|
def internalize!(all_but_main = true)
|
|
67
|
-
C.add_internalize_pass(self, all_but_main)
|
|
101
|
+
C.add_internalize_pass(self, all_but_main ? 1 : 0)
|
|
68
102
|
end
|
|
69
103
|
|
|
70
104
|
# @LLVMpass sdp
|
|
105
|
+
# /** See llvm::createStripDeadPrototypesPass function. */
|
|
106
|
+
# void LLVMAddStripDeadPrototypesPass(LLVMPassManagerRef PM);
|
|
71
107
|
def sdp!
|
|
72
108
|
C.add_strip_dead_prototypes_pass(self)
|
|
73
109
|
end
|
|
74
110
|
|
|
75
111
|
# @LLVMpass strip
|
|
112
|
+
# /** See llvm::createStripSymbolsPass function. */
|
|
113
|
+
# void LLVMAddStripSymbolsPass(LLVMPassManagerRef PM);
|
|
76
114
|
def strip!
|
|
77
115
|
C.add_strip_symbols_pass(self)
|
|
78
116
|
end
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
module C
|
|
121
|
+
attach_function :add_merge_functions_pass, :LLVMAddMergeFunctionsPass, [:pointer], :void
|
|
122
|
+
attach_function :add_called_value_propagation_pass, :LLVMAddCalledValuePropagationPass, [:pointer], :void
|
|
79
123
|
end
|
|
80
124
|
end
|
|
@@ -12,14 +12,6 @@ module LLVM::C
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
# See llvm::createArgumentPromotionPass function.
|
|
16
|
-
#
|
|
17
|
-
# @method add_argument_promotion_pass(pm)
|
|
18
|
-
# @param [FFI::Pointer(PassManagerRef)] pm
|
|
19
|
-
# @return [nil]
|
|
20
|
-
# @scope class
|
|
21
|
-
attach_function :add_argument_promotion_pass, :LLVMAddArgumentPromotionPass, [:pointer], :void
|
|
22
|
-
|
|
23
15
|
# See llvm::createConstantMergePass function.
|
|
24
16
|
#
|
|
25
17
|
# @method add_constant_merge_pass(pm)
|
|
@@ -76,14 +68,6 @@ module LLVM::C
|
|
|
76
68
|
# @scope class
|
|
77
69
|
attach_function :add_global_optimizer_pass, :LLVMAddGlobalOptimizerPass, [:pointer], :void
|
|
78
70
|
|
|
79
|
-
# See llvm::createIPConstantPropagationPass function.
|
|
80
|
-
#
|
|
81
|
-
# @method add_ip_constant_propagation_pass(pm)
|
|
82
|
-
# @param [FFI::Pointer(PassManagerRef)] pm
|
|
83
|
-
# @return [nil]
|
|
84
|
-
# @scope class
|
|
85
|
-
attach_function :add_ip_constant_propagation_pass, :LLVMAddIPConstantPropagationPass, [:pointer], :void
|
|
86
|
-
|
|
87
71
|
# See llvm::createPruneEHPass function.
|
|
88
72
|
#
|
|
89
73
|
# @method add_prune_eh_pass(pm)
|
|
@@ -7,158 +7,320 @@ require 'llvm/transforms/scalar_ffi'
|
|
|
7
7
|
module LLVM
|
|
8
8
|
class PassManager
|
|
9
9
|
# @LLVMpass adce
|
|
10
|
+
# /** See llvm::createAggressiveDCEPass function. */
|
|
11
|
+
# void LLVMAddAggressiveDCEPass(LLVMPassManagerRef PM);
|
|
10
12
|
def adce!
|
|
11
13
|
C.add_aggressive_dce_pass(self)
|
|
12
14
|
end
|
|
13
15
|
|
|
16
|
+
# @LLVMpass dce
|
|
17
|
+
# /** See llvm::createDeadCodeEliminationPass function. */
|
|
18
|
+
# void LLVMAddDCEPass(LLVMPassManagerRef PM);
|
|
19
|
+
def dce!
|
|
20
|
+
C.add_dce_pass(self)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @LLVMpass bdce
|
|
24
|
+
# /** See llvm::createBitTrackingDCEPass function. */
|
|
25
|
+
# void LLVMAddBitTrackingDCEPass(LLVMPassManagerRef PM);
|
|
26
|
+
def bdce!
|
|
27
|
+
C.add_bit_tracking_dce_pass(self)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @LLVMpass alignment_from_assumptions
|
|
31
|
+
# /** See llvm::createAlignmentFromAssumptionsPass function. */
|
|
32
|
+
# void LLVMAddAlignmentFromAssumptionsPass(LLVMPassManagerRef PM);
|
|
33
|
+
def alignment_from_assumptions!
|
|
34
|
+
C.add_alignment_from_assumptions_pass(self)
|
|
35
|
+
end
|
|
36
|
+
|
|
14
37
|
# @LLVMpass simplifycfg
|
|
38
|
+
# /** See llvm::createCFGSimplificationPass function. */
|
|
39
|
+
# void LLVMAddCFGSimplificationPass(LLVMPassManagerRef PM);
|
|
15
40
|
def simplifycfg!
|
|
16
41
|
C.add_cfg_simplification_pass(self)
|
|
17
42
|
end
|
|
18
43
|
|
|
19
44
|
# @LLVMpass dse
|
|
45
|
+
# /** See llvm::createDeadStoreEliminationPass function. */
|
|
46
|
+
# void LLVMAddDeadStoreEliminationPass(LLVMPassManagerRef PM);
|
|
20
47
|
def dse!
|
|
21
48
|
C.add_dead_store_elimination_pass(self)
|
|
22
49
|
end
|
|
23
50
|
|
|
51
|
+
# @LLVMPass scalarizer
|
|
52
|
+
# /** See llvm::createScalarizerPass function. */
|
|
53
|
+
# void LLVMAddScalarizerPass(LLVMPassManagerRef PM);
|
|
54
|
+
def scalarizer!
|
|
55
|
+
C.add_scalarizer_pass(self)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @LLVMpass mldst-motion
|
|
59
|
+
# /** See llvm::createMergedLoadStoreMotionPass function. */
|
|
60
|
+
# void LLVMAddMergedLoadStoreMotionPass(LLVMPassManagerRef PM);
|
|
61
|
+
def mldst_motion!
|
|
62
|
+
C.add_merged_load_store_motion_pass(self)
|
|
63
|
+
end
|
|
64
|
+
|
|
24
65
|
# @LLVMpass gvn
|
|
66
|
+
# /** See llvm::createGVNPass function. */
|
|
67
|
+
# void LLVMAddGVNPass(LLVMPassManagerRef PM);
|
|
25
68
|
def gvn!
|
|
26
69
|
C.add_gvn_pass(self)
|
|
27
70
|
end
|
|
28
71
|
|
|
72
|
+
# @LLVMpass newgvn
|
|
73
|
+
# /** See llvm::createGVNPass function. */
|
|
74
|
+
# void LLVMAddNewGVNPass(LLVMPassManagerRef PM);
|
|
75
|
+
def newgvn!
|
|
76
|
+
C.add_new_gvn_pass(self)
|
|
77
|
+
end
|
|
78
|
+
|
|
29
79
|
# @LLVMpass indvars
|
|
80
|
+
# /** See llvm::createIndVarSimplifyPass function. */
|
|
81
|
+
# void LLVMAddIndVarSimplifyPass(LLVMPassManagerRef PM);
|
|
30
82
|
def indvars!
|
|
31
83
|
C.add_ind_var_simplify_pass(self)
|
|
32
84
|
end
|
|
33
85
|
|
|
34
86
|
# @LLVMpass instcombine
|
|
87
|
+
# /** See llvm::createInstructionCombiningPass function. */
|
|
88
|
+
# void LLVMAddInstructionCombiningPass(LLVMPassManagerRef PM);
|
|
35
89
|
def instcombine!
|
|
36
90
|
C.add_instruction_combining_pass(self)
|
|
37
91
|
end
|
|
38
92
|
|
|
93
|
+
# @LLVMpass instsimplify
|
|
94
|
+
# /** See llvm::createInstSimplifyLegacyPass function. */
|
|
95
|
+
# void LLVMAddInstructionSimplifyPass(LLVMPassManagerRef PM);
|
|
96
|
+
def instsimplify!
|
|
97
|
+
C.add_instruction_simplify_pass(self)
|
|
98
|
+
end
|
|
99
|
+
|
|
39
100
|
# @LLVMpass jump-threading
|
|
101
|
+
# /** See llvm::createJumpThreadingPass function. */
|
|
102
|
+
# void LLVMAddJumpThreadingPass(LLVMPassManagerRef PM);
|
|
40
103
|
def jump_threading!
|
|
41
104
|
C.add_jump_threading_pass(self)
|
|
42
105
|
end
|
|
43
106
|
|
|
44
107
|
# @LLVMpass licm
|
|
108
|
+
# /** See llvm::createLICMPass function. */
|
|
109
|
+
# void LLVMAddLICMPass(LLVMPassManagerRef PM);
|
|
45
110
|
def licm!
|
|
46
111
|
C.add_licm_pass(self)
|
|
47
112
|
end
|
|
48
113
|
|
|
49
114
|
# @LLVMpass loop-deletion
|
|
115
|
+
# /** See llvm::createLoopDeletionPass function. */
|
|
116
|
+
# void LLVMAddLoopDeletionPass(LLVMPassManagerRef PM);
|
|
50
117
|
def loop_deletion!
|
|
51
118
|
C.add_loop_deletion_pass(self)
|
|
52
119
|
end
|
|
53
120
|
|
|
54
121
|
# @LLVMpass loop-idiom
|
|
122
|
+
# /** See llvm::createLoopIdiomPass function */
|
|
123
|
+
# void LLVMAddLoopIdiomPass(LLVMPassManagerRef PM);
|
|
55
124
|
def loop_idiom!
|
|
56
125
|
C.add_loop_idiom_pass(self)
|
|
57
126
|
end
|
|
58
127
|
|
|
59
128
|
# @LLVMpass loop-rotate
|
|
129
|
+
# /** See llvm::createLoopRotatePass function. */
|
|
130
|
+
# void LLVMAddLoopRotatePass(LLVMPassManagerRef PM);
|
|
60
131
|
def loop_rotate!
|
|
61
132
|
C.add_loop_rotate_pass(self)
|
|
62
133
|
end
|
|
63
134
|
|
|
135
|
+
# @LLVMpass loop-reroll
|
|
136
|
+
# /** See llvm::createLoopRerollPass function. */
|
|
137
|
+
# void LLVMAddLoopRerollPass(LLVMPassManagerRef PM);
|
|
138
|
+
def loop_reroll!
|
|
139
|
+
C.add_loop_reroll_pass(self)
|
|
140
|
+
end
|
|
141
|
+
|
|
64
142
|
# @LLVMpass loop-unroll
|
|
143
|
+
# /** See llvm::createLoopUnrollPass function. */
|
|
144
|
+
# void LLVMAddLoopUnrollPass(LLVMPassManagerRef PM);
|
|
65
145
|
def loop_unroll!
|
|
66
146
|
C.add_loop_unroll_pass(self)
|
|
67
147
|
end
|
|
68
148
|
|
|
149
|
+
# @LLVMpass loop-unroll-and-jam
|
|
150
|
+
# /** See llvm::createLoopUnrollAndJamPass function. */
|
|
151
|
+
# void LLVMAddLoopUnrollAndJamPass(LLVMPassManagerRef PM);
|
|
152
|
+
def loop_unroll_and_jam!
|
|
153
|
+
C.add_loop_unroll_and_jam_pass(self)
|
|
154
|
+
end
|
|
155
|
+
|
|
69
156
|
# @LLVMpass loop-unswitch
|
|
70
157
|
def loop_unswitch!
|
|
71
|
-
|
|
158
|
+
warn('loop_unswitch! / LLVMAddLoopUnswitchPass was removed in LLVM 15')
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# @LLVMpass loweratomic
|
|
162
|
+
# /** See llvm::createLowerAtomicPass function. */
|
|
163
|
+
# void LLVMAddLowerAtomicPass(LLVMPassManagerRef PM);
|
|
164
|
+
def loweratomic!
|
|
165
|
+
C.add_lower_atomic_pass(self)
|
|
72
166
|
end
|
|
73
167
|
|
|
74
168
|
# @LLVMpass memcpyopt
|
|
169
|
+
# /** See llvm::createMemCpyOptPass function. */
|
|
170
|
+
# void LLVMAddMemCpyOptPass(LLVMPassManagerRef PM);
|
|
75
171
|
def memcpyopt!
|
|
76
172
|
C.add_mem_cpy_opt_pass(self)
|
|
77
173
|
end
|
|
78
174
|
|
|
79
|
-
# @LLVMpass
|
|
80
|
-
|
|
81
|
-
|
|
175
|
+
# @LLVMpass partially-inline-libcalls
|
|
176
|
+
# /** See llvm::createPartiallyInlineLibCallsPass function. */
|
|
177
|
+
# void LLVMAddPartiallyInlineLibCallsPass(LLVMPassManagerRef PM);
|
|
178
|
+
def partially_inline_libcalls!
|
|
179
|
+
C.add_partially_inline_lib_calls_pass(self)
|
|
82
180
|
end
|
|
83
181
|
|
|
84
182
|
# @LLVMpass reassociate
|
|
183
|
+
# /** See llvm::createReassociatePass function. */
|
|
184
|
+
# void LLVMAddReassociatePass(LLVMPassManagerRef PM);
|
|
85
185
|
def reassociate!
|
|
86
186
|
C.add_reassociate_pass(self)
|
|
87
187
|
end
|
|
88
188
|
|
|
89
189
|
# @LLVMpass sccp
|
|
190
|
+
# /** See llvm::createSCCPPass function. */
|
|
191
|
+
# void LLVMAddSCCPPass(LLVMPassManagerRef PM);
|
|
90
192
|
def sccp!
|
|
91
193
|
C.add_sccp_pass(self)
|
|
92
194
|
end
|
|
93
195
|
|
|
94
|
-
# @LLVMpass
|
|
196
|
+
# @LLVMpass sroa
|
|
197
|
+
# /** See llvm::createSROAPass function. */
|
|
198
|
+
# void LLVMAddScalarReplAggregatesPass(LLVMPassManagerRef PM);
|
|
95
199
|
def scalarrepl!
|
|
96
200
|
C.add_scalar_repl_aggregates_pass(self)
|
|
97
201
|
end
|
|
98
202
|
|
|
99
|
-
# @LLVMpass
|
|
203
|
+
# @LLVMpass sroa
|
|
204
|
+
# /** See llvm::createSROAPass function. */
|
|
205
|
+
# void LLVMAddScalarReplAggregatesPassSSA(LLVMPassManagerRef PM);
|
|
100
206
|
def scalarrepl_ssa!
|
|
101
207
|
C.add_scalar_repl_aggregates_pass_ssa(self)
|
|
102
208
|
end
|
|
103
209
|
|
|
104
|
-
# @LLVMpass
|
|
105
|
-
|
|
106
|
-
|
|
210
|
+
# @LLVMpass sroa
|
|
211
|
+
# /** See llvm::createSROAPass function. */
|
|
212
|
+
# void LLVMAddScalarReplAggregatesPassWithThreshold(LLVMPassManagerRef PM,
|
|
213
|
+
# int Threshold);
|
|
214
|
+
# threshold appears unused: https://llvm.org/doxygen/Scalar_8cpp_source.html#l00211
|
|
215
|
+
def scalarrepl_threshold!(threshold = 0)
|
|
216
|
+
C.add_scalar_repl_aggregates_pass_with_threshold(self, threshold)
|
|
107
217
|
end
|
|
108
218
|
|
|
109
219
|
# @LLVMpass simplify-libcalls
|
|
220
|
+
# /** See llvm::createSimplifyLibCallsPass function. */
|
|
221
|
+
# void LLVMAddSimplifyLibCallsPass(LLVMPassManagerRef PM);
|
|
222
|
+
# removed: https://llvm.org/doxygen/Scalar_8cpp_source.html#l00211
|
|
110
223
|
def simplify_libcalls!
|
|
111
|
-
|
|
224
|
+
warn('simplify_libcalls! / LLVMAddSimplifyLibCallsPass was removed from LLVM')
|
|
112
225
|
end
|
|
113
226
|
|
|
114
227
|
# @LLVMpass tailcallelim
|
|
228
|
+
# /** See llvm::createTailCallEliminationPass function. */
|
|
229
|
+
# void LLVMAddTailCallEliminationPass(LLVMPassManagerRef PM);
|
|
115
230
|
def tailcallelim!
|
|
116
231
|
C.add_tail_call_elimination_pass(self)
|
|
117
232
|
end
|
|
118
233
|
|
|
119
234
|
# @LLVMpass constprop
|
|
120
235
|
def constprop!
|
|
121
|
-
|
|
236
|
+
warn('constprop! / LLVMAddConstantPropagationPass was removed from LLVM')
|
|
122
237
|
end
|
|
123
238
|
|
|
124
239
|
# @LLVMpass reg2mem
|
|
240
|
+
# /** See llvm::demotePromoteMemoryToRegisterPass function. */
|
|
241
|
+
# void LLVMAddDemoteMemoryToRegisterPass(LLVMPassManagerRef PM);
|
|
125
242
|
def reg2mem!
|
|
126
243
|
C.add_demote_memory_to_register_pass(self)
|
|
127
244
|
end
|
|
128
245
|
|
|
246
|
+
# @LLVMpass verify
|
|
247
|
+
# /** See llvm::createVerifierPass function. */
|
|
248
|
+
# void LLVMAddVerifierPass(LLVMPassManagerRef PM);
|
|
249
|
+
def verify!
|
|
250
|
+
C.add_verifier_pass(self)
|
|
251
|
+
end
|
|
252
|
+
|
|
129
253
|
# @LLVMpass cvprop
|
|
254
|
+
# /** See llvm::createCorrelatedValuePropagationPass function */
|
|
255
|
+
# void LLVMAddCorrelatedValuePropagationPass(LLVMPassManagerRef PM);
|
|
130
256
|
def cvprop!
|
|
131
257
|
C.add_correlated_value_propagation_pass(self)
|
|
132
258
|
end
|
|
133
259
|
|
|
134
260
|
# @LLVMpass early-cse
|
|
261
|
+
# /** See llvm::createEarlyCSEPass function */
|
|
262
|
+
# void LLVMAddEarlyCSEPass(LLVMPassManagerRef PM);
|
|
135
263
|
def early_cse!
|
|
136
264
|
C.add_early_cse_pass(self)
|
|
137
265
|
end
|
|
138
266
|
|
|
267
|
+
# @LLVMpass early-cse-memssa
|
|
268
|
+
# /** See llvm::createEarlyCSEPass function */
|
|
269
|
+
# void LLVMAddEarlyCSEMemSSAPass(LLVMPassManagerRef PM);
|
|
270
|
+
def early_cse_memssa!
|
|
271
|
+
C.add_early_cse_mem_ssa_pass(self)
|
|
272
|
+
end
|
|
273
|
+
|
|
139
274
|
# @LLVMpass lower-expect
|
|
275
|
+
# /** See llvm::createLowerExpectIntrinsicPass function */
|
|
276
|
+
# void LLVMAddLowerExpectIntrinsicPass(LLVMPassManagerRef PM);
|
|
140
277
|
def lower_expect!
|
|
141
278
|
C.add_lower_expect_intrinsic_pass(self)
|
|
142
279
|
end
|
|
143
280
|
|
|
281
|
+
# @LLVMPass lower-constant-intrinsics
|
|
282
|
+
# /** See llvm::createLowerConstantIntrinsicsPass function */
|
|
283
|
+
# void LLVMAddLowerConstantIntrinsicsPass(LLVMPassManagerRef PM);
|
|
284
|
+
def lower_constant_intrinsics!
|
|
285
|
+
C.add_lower_constant_intrinsics_pass(self)
|
|
286
|
+
end
|
|
287
|
+
|
|
144
288
|
# @LLVMpass tbaa
|
|
289
|
+
# /** See llvm::createTypeBasedAliasAnalysisPass function */
|
|
290
|
+
# void LLVMAddTypeBasedAliasAnalysisPass(LLVMPassManagerRef PM);
|
|
145
291
|
def tbaa!
|
|
146
292
|
C.add_type_based_alias_analysis_pass(self)
|
|
147
293
|
end
|
|
148
294
|
|
|
295
|
+
# @ LLVMPass scoped-noalias-aa
|
|
296
|
+
# /** See llvm::createScopedNoAliasAAPass function */
|
|
297
|
+
# void LLVMAddScopedNoAliasAAPass(LLVMPassManagerRef PM);
|
|
298
|
+
def scoped_noalias_aa!
|
|
299
|
+
C.add_scoped_no_alias_aa_pass(self)
|
|
300
|
+
end
|
|
301
|
+
|
|
149
302
|
# @LLVMpass basicaa
|
|
303
|
+
# /** See llvm::createBasicAliasAnalysisPass function */
|
|
304
|
+
# void LLVMAddBasicAliasAnalysisPass(LLVMPassManagerRef PM);
|
|
150
305
|
def basicaa!
|
|
151
306
|
C.add_basic_alias_analysis_pass(self)
|
|
152
307
|
end
|
|
153
308
|
|
|
154
|
-
# @LLVMpass
|
|
155
|
-
|
|
156
|
-
|
|
309
|
+
# @LLVMpass mergereturn
|
|
310
|
+
# /** See llvm::createUnifyFunctionExitNodesPass function */
|
|
311
|
+
# void LLVMAddUnifyFunctionExitNodesPass(LLVMPassManagerRef PM);
|
|
312
|
+
def mergereturn!
|
|
313
|
+
C.add_unify_function_exit_nodes_pass(self)
|
|
157
314
|
end
|
|
158
315
|
|
|
159
316
|
end
|
|
160
317
|
|
|
161
318
|
module C
|
|
162
|
-
attach_function :
|
|
319
|
+
attach_function :add_dce_pass, :LLVMAddDCEPass, [:pointer], :void
|
|
320
|
+
attach_function :add_instruction_simplify_pass, :LLVMAddInstructionSimplifyPass, [:pointer], :void
|
|
321
|
+
attach_function :add_loop_unroll_and_jam_pass, :LLVMAddLoopUnrollAndJamPass, [:pointer], :void
|
|
322
|
+
attach_function :add_lower_atomic_pass, :LLVMAddLowerAtomicPass, [:pointer], :void
|
|
323
|
+
attach_function :add_lower_constant_intrinsics_pass, :LLVMAddLowerConstantIntrinsicsPass, [:pointer], :void
|
|
324
|
+
attach_function :add_unify_function_exit_nodes_pass, :LLVMAddUnifyFunctionExitNodesPass, [:pointer], :void
|
|
163
325
|
end
|
|
164
326
|
end
|
|
@@ -164,14 +164,6 @@ module LLVM::C
|
|
|
164
164
|
# @scope class
|
|
165
165
|
attach_function :add_loop_unroll_pass, :LLVMAddLoopUnrollPass, [:pointer], :void
|
|
166
166
|
|
|
167
|
-
# See llvm::createLoopUnswitchPass function.
|
|
168
|
-
#
|
|
169
|
-
# @method add_loop_unswitch_pass(pm)
|
|
170
|
-
# @param [FFI::Pointer(PassManagerRef)] pm
|
|
171
|
-
# @return [nil]
|
|
172
|
-
# @scope class
|
|
173
|
-
attach_function :add_loop_unswitch_pass, :LLVMAddLoopUnswitchPass, [:pointer], :void
|
|
174
|
-
|
|
175
167
|
# See llvm::createMemCpyOptPass function.
|
|
176
168
|
#
|
|
177
169
|
# @method add_mem_cpy_opt_pass(pm)
|
|
@@ -245,14 +237,6 @@ module LLVM::C
|
|
|
245
237
|
# @scope class
|
|
246
238
|
attach_function :add_scalar_repl_aggregates_pass_with_threshold, :LLVMAddScalarReplAggregatesPassWithThreshold, [:pointer, :int], :void
|
|
247
239
|
|
|
248
|
-
# See llvm::createSimplifyLibCallsPass function.
|
|
249
|
-
#
|
|
250
|
-
# @method add_simplify_lib_calls_pass(pm)
|
|
251
|
-
# @param [FFI::Pointer(PassManagerRef)] pm
|
|
252
|
-
# @return [nil]
|
|
253
|
-
# @scope class
|
|
254
|
-
attach_function :add_simplify_lib_calls_pass, :LLVMAddSimplifyLibCallsPass, [:pointer], :void
|
|
255
|
-
|
|
256
240
|
# See llvm::createTailCallEliminationPass function.
|
|
257
241
|
#
|
|
258
242
|
# @method add_tail_call_elimination_pass(pm)
|
|
@@ -261,14 +245,6 @@ module LLVM::C
|
|
|
261
245
|
# @scope class
|
|
262
246
|
attach_function :add_tail_call_elimination_pass, :LLVMAddTailCallEliminationPass, [:pointer], :void
|
|
263
247
|
|
|
264
|
-
# See llvm::createConstantPropagationPass function.
|
|
265
|
-
#
|
|
266
|
-
# @method add_constant_propagation_pass(pm)
|
|
267
|
-
# @param [FFI::Pointer(PassManagerRef)] pm
|
|
268
|
-
# @return [nil]
|
|
269
|
-
# @scope class
|
|
270
|
-
attach_function :add_constant_propagation_pass, :LLVMAddConstantPropagationPass, [:pointer], :void
|
|
271
|
-
|
|
272
248
|
# See llvm::demotePromoteMemoryToRegisterPass function.
|
|
273
249
|
#
|
|
274
250
|
# @method add_demote_memory_to_register_pass(pm)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'llvm'
|
|
4
|
+
require 'llvm/core'
|
|
5
|
+
|
|
6
|
+
module LLVM
|
|
7
|
+
class PassManager
|
|
8
|
+
|
|
9
|
+
# @LLVMpass lowerswitch
|
|
10
|
+
# /** See llvm::createLowerSwitchPass function. */
|
|
11
|
+
# void LLVMAddLowerSwitchPass(LLVMPassManagerRef PM);
|
|
12
|
+
def lowerswitch!
|
|
13
|
+
C.add_lower_switch_pass(self)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @LLVMpass mem2reg
|
|
17
|
+
# /** See llvm::createPromoteMemoryToRegisterPass function. */
|
|
18
|
+
# void LLVMAddPromoteMemoryToRegisterPass(LLVMPassManagerRef PM);
|
|
19
|
+
def mem2reg!
|
|
20
|
+
C.add_promote_memory_to_register_pass(self)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @LLVMpass add-discriminators
|
|
24
|
+
# /** See llvm::createAddDiscriminatorsPass function. */
|
|
25
|
+
# void LLVMAddAddDiscriminatorsPass(LLVMPassManagerRef PM);
|
|
26
|
+
def add_discriminators!
|
|
27
|
+
C.add_add_discriminators_pass(self)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
module C
|
|
32
|
+
attach_function :add_add_discriminators_pass, :LLVMAddAddDiscriminatorsPass, [:pointer], :void
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -8,15 +8,20 @@ module LLVM
|
|
|
8
8
|
class PassManager
|
|
9
9
|
# @LLVMpass bb_vectorize
|
|
10
10
|
def bb_vectorize!
|
|
11
|
-
|
|
11
|
+
warn('bb_vectorize! / LLVMAddBBVectorizePass was removed from LLVM - replace with slp_vectorize!')
|
|
12
|
+
slp_vectorize!
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
# @LLVMpass loop_vectorize
|
|
16
|
+
# /** See llvm::createLoopVectorizePass function. */
|
|
17
|
+
# void LLVMAddLoopVectorizePass(LLVMPassManagerRef PM);
|
|
15
18
|
def loop_vectorize!
|
|
16
19
|
C.add_loop_vectorize_pass(self)
|
|
17
20
|
end
|
|
18
21
|
|
|
19
22
|
# @LLVMpass slp_vectorize
|
|
23
|
+
# /** See llvm::createSLPVectorizerPass function. */
|
|
24
|
+
# void LLVMAddSLPVectorizePass(LLVMPassManagerRef PM);
|
|
20
25
|
def slp_vectorize!
|
|
21
26
|
C.add_slp_vectorize_pass(self)
|
|
22
27
|
end
|
data/lib/llvm/version.rb
CHANGED
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.
|
|
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-
|
|
12
|
+
date: 2023-05-15 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: ffi
|
|
@@ -197,7 +197,6 @@ files:
|
|
|
197
197
|
- lib/llvm/core/builder.rb
|
|
198
198
|
- lib/llvm/core/context.rb
|
|
199
199
|
- lib/llvm/core/module.rb
|
|
200
|
-
- lib/llvm/core/opaque_pointer_builder.rb
|
|
201
200
|
- lib/llvm/core/pass_manager.rb
|
|
202
201
|
- lib/llvm/core/type.rb
|
|
203
202
|
- lib/llvm/core/value.rb
|
|
@@ -215,6 +214,7 @@ files:
|
|
|
215
214
|
- lib/llvm/transforms/ipo_ffi.rb
|
|
216
215
|
- lib/llvm/transforms/scalar.rb
|
|
217
216
|
- lib/llvm/transforms/scalar_ffi.rb
|
|
217
|
+
- lib/llvm/transforms/utils.rb
|
|
218
218
|
- lib/llvm/transforms/vectorize.rb
|
|
219
219
|
- lib/llvm/transforms/vectorize_ffi.rb
|
|
220
220
|
- lib/llvm/version.rb
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
# module LLVM
|
|
3
|
-
# module OpaquePointerBuilder
|
|
4
|
-
# # Builds a struct getelementptr Instruction.
|
|
5
|
-
# #
|
|
6
|
-
# # @param [LLVM::Value] pointer A pointer to a structure
|
|
7
|
-
# # @param [LLVM::Value] idx Unsigned integer representing the index of a
|
|
8
|
-
# # structure member
|
|
9
|
-
# # @param [String] name The name of the result in LLVM IR
|
|
10
|
-
# # @return [LLVM::Instruction] The resulting pointer
|
|
11
|
-
# # @LLVMinst gep
|
|
12
|
-
# # @see http://llvm.org/docs/GetElementPtr.html
|
|
13
|
-
# def struct_gep1(pointer, idx, name = "")
|
|
14
|
-
# Instruction.from_ptr(C.build_struct_gep(self, pointer, idx, name))
|
|
15
|
-
# end
|
|
16
|
-
#
|
|
17
|
-
# private def struct_gep2(type, pointer, idx, name)
|
|
18
|
-
# Instruction.from_ptr(C.build_struct_gep2(self, type, pointer, idx, name))
|
|
19
|
-
# end
|
|
20
|
-
#
|
|
21
|
-
# def struct_gep(pointer, idx, name = "", type = nil)
|
|
22
|
-
# type2 = type || must_infer_type(pointer)
|
|
23
|
-
# struct_gep2(types2, pointer, idx, name)
|
|
24
|
-
# end
|
|
25
|
-
# end
|
|
26
|
-
# end
|