1
1
import core:: { vec, str, option} ;
2
2
import str:: sbuf;
3
3
4
- import llvm:: { TypeRef , MemoryBufferRef ,
5
- PassManagerRef , TargetDataRef ,
6
- ObjectFileRef , SectionIteratorRef } ;
7
4
import ctypes:: { c_int, c_uint, unsigned, longlong, ulonglong} ;
8
5
9
- type Long = i32 ;
10
- type Bool = int ;
6
+ type Opcode = u32 ;
7
+ type Bool = unsigned ;
8
+ const True : Bool = 1u32 ;
9
+ const False : Bool = 0u32 ;
11
10
11
+ // Consts for the LLVM CallConv type, pre-cast to uint.
12
12
13
- const True : Bool = 1 ;
14
- const False : Bool = 0 ;
13
+ enum CallConv {
14
+ CCallConv = 0 ,
15
+ FastCallConv = 8 ,
16
+ ColdCallConv = 9 ,
17
+ X86StdcallCallConv = 64 ,
18
+ X86FastcallCallConv = 65 ,
19
+ }
15
20
16
- // Consts for the LLVM CallConv type, pre-cast to uint.
17
- // FIXME: figure out a way to merge these with the native
18
- // typedef and/or a enum type in the native module below.
19
-
20
- const LLVMCCallConv : uint = 0 u;
21
- const LLVMFastCallConv : uint = 8 u;
22
- const LLVMColdCallConv : uint = 9 u;
23
- const LLVMX86StdcallCallConv : uint = 64 u;
24
- const LLVMX86FastcallCallConv : uint = 65 u;
25
-
26
- const LLVMDefaultVisibility : uint = 0 u;
27
- const LLVMHiddenVisibility : uint = 1 u;
28
- const LLVMProtectedVisibility : uint = 2 u;
29
-
30
- const LLVMExternalLinkage : uint = 0 u;
31
- const LLVMAvailableExternallyLinkage : uint = 1 u;
32
- const LLVMLinkOnceAnyLinkage : uint = 2 u;
33
- const LLVMLinkOnceODRLinkage : uint = 3 u;
34
- const LLVMWeakAnyLinkage : uint = 4 u;
35
- const LLVMWeakODRLinkage : uint = 5 u;
36
- const LLVMAppendingLinkage : uint = 6 u;
37
- const LLVMInternalLinkage : uint = 7 u;
38
- const LLVMPrivateLinkage : uint = 8 u;
39
- const LLVMDLLImportLinkage : uint = 9 u;
40
- const LLVMDLLExportLinkage : uint = 10 u;
41
- const LLVMExternalWeakLinkage : uint = 11 u;
42
- const LLVMGhostLinkage : uint = 12 u;
43
- const LLVMCommonLinkage : uint = 13 u;
44
- const LLVMLinkerPrivateLinkage : uint = 14 u;
45
- const LLVMLinkerPrivateWeakLinkage : uint = 15 u;
46
- const LLVMLinkerPrivateWeakDefAutoLinkage : uint = 16 u;
47
-
48
- const LLVMZExtAttribute : uint = 1 u;
49
- const LLVMSExtAttribute : uint = 2 u;
50
- const LLVMNoReturnAttribute : uint = 4 u;
51
- const LLVMInRegAttribute : uint = 8 u;
52
- const LLVMStructRetAttribute : uint = 16 u;
53
- const LLVMNoUnwindAttribute : uint = 32 u;
54
- const LLVMNoAliasAttribute : uint = 64 u;
55
- const LLVMByValAttribute : uint = 128 u;
56
- const LLVMNestAttribute : uint = 256 u;
57
- const LLVMReadNoneAttribute : uint = 512 u;
58
- const LLVMReadOnlyAttribute : uint = 1024 u;
59
- const LLVMNoInlineAttribute : uint = 2048 u;
60
- const LLVMAlwaysInlineAttribute : uint = 4096 u;
61
- const LLVMOptimizeForSizeAttribute : uint = 8192 u;
62
- const LLVMStackProtectAttribute : uint = 16384 u;
63
- const LLVMStackProtectReqAttribute : uint = 32768 u;
64
- // 31 << 16
65
- const LLVMAlignmentAttribute : uint = 2031616 u;
66
- const LLVMNoCaptureAttribute : uint = 2097152 u;
67
- const LLVMNoRedZoneAttribute : uint = 4194304 u;
68
- const LLVMNoImplicitFloatAttribute : uint = 8388608 u;
69
- const LLVMNakedAttribute : uint = 16777216 u;
70
- const LLVMInlineHintAttribute : uint = 33554432 u;
71
- // 7 << 26
72
- const LLVMStackAttribute : uint = 469762048 u;
73
- const LLVMReturnsTwiceAttribute : uint = 536870912 u;
74
- // 1 << 30
75
- const LLVMUWTableAttribute : uint = 1073741824 u;
76
- const LLVMNonLazyBindAttribute : uint = 2147483648 u;
21
+ enum Visibility {
22
+ LLVMDefaultVisibility = 0 ,
23
+ HiddenVisibility = 1 ,
24
+ ProtectedVisibility = 2 ,
25
+ }
26
+
27
+ enum Linkage {
28
+ ExternalLinkage = 0 ,
29
+ AvailableExternallyLinkage = 1 ,
30
+ LinkOnceAnyLinkage = 2 ,
31
+ LinkOnceODRLinkage = 3 ,
32
+ WeakAnyLinkage = 4 ,
33
+ WeakODRLinkage = 5 ,
34
+ AppendingLinkage = 6 ,
35
+ InternalLinkage = 7 ,
36
+ PrivateLinkage = 8 ,
37
+ DLLImportLinkage = 9 ,
38
+ DLLExportLinkage = 10 ,
39
+ ExternalWeakLinkage = 11 ,
40
+ GhostLinkage = 12 ,
41
+ CommonLinkage = 13 ,
42
+ LinkerPrivateLinkage = 14 ,
43
+ LinkerPrivateWeakLinkage = 15 ,
44
+ LinkerPrivateWeakDefAutoLinkage = 16 ,
45
+ }
77
46
47
+ enum Attribute {
48
+ ZExtAttribute = 1 ,
49
+ SExtAttribute = 2 ,
50
+ NoReturnAttribute = 4 ,
51
+ InRegAttribute = 8 ,
52
+ StructRetAttribute = 16 ,
53
+ NoUnwindAttribute = 32 ,
54
+ NoAliasAttribute = 64 ,
55
+ ByValAttribute = 128 ,
56
+ NestAttribute = 256 ,
57
+ ReadNoneAttribute = 512 ,
58
+ ReadOnlyAttribute = 1024 ,
59
+ NoInlineAttribute = 2048 ,
60
+ AlwaysInlineAttribute = 4096 ,
61
+ OptimizeForSizeAttribute = 8192 ,
62
+ StackProtectAttribute = 16384 ,
63
+ StackProtectReqAttribute = 32768 ,
64
+ // 31 << 16
65
+ AlignmentAttribute = 2031616 ,
66
+ NoCaptureAttribute = 2097152 ,
67
+ NoRedZoneAttribute = 4194304 ,
68
+ NoImplicitFloatAttribute = 8388608 ,
69
+ NakedAttribute = 16777216 ,
70
+ InlineHintAttribute = 33554432 ,
71
+ // 7 << 26
72
+ StackAttribute = 469762048 ,
73
+ ReturnsTwiceAttribute = 536870912 ,
74
+ // 1 << 30
75
+ UWTableAttribute = 1073741824 ,
76
+ NonLazyBindAttribute = 2147483648 ,
77
+ }
78
78
79
79
// Consts for the LLVM IntPredicate type, pre-cast to uint.
80
80
// FIXME: as above.
81
81
82
-
83
- const LLVMIntEQ : uint = 32 u ;
84
- const LLVMIntNE : uint = 33 u ;
85
- const LLVMIntUGT : uint = 34 u ;
86
- const LLVMIntUGE : uint = 35 u ;
87
- const LLVMIntULT : uint = 36 u ;
88
- const LLVMIntULE : uint = 37 u ;
89
- const LLVMIntSGT : uint = 38 u ;
90
- const LLVMIntSGE : uint = 39 u ;
91
- const LLVMIntSLT : uint = 40 u ;
92
- const LLVMIntSLE : uint = 41 u ;
93
-
82
+ enum IntPredicate {
83
+ IntEQ = 32 ,
84
+ IntNE = 33 ,
85
+ IntUGT = 34 ,
86
+ IntUGE = 35 ,
87
+ IntULT = 36 ,
88
+ IntULE = 37 ,
89
+ IntSGT = 38 ,
90
+ IntSGE = 39 ,
91
+ IntSLT = 40 ,
92
+ IntSLE = 41 ,
93
+ }
94
94
95
95
// Consts for the LLVM RealPredicate type, pre-case to uint.
96
96
// FIXME: as above.
97
97
98
- const LLVMRealOEQ : uint = 1 u;
99
- const LLVMRealOGT : uint = 2 u;
100
- const LLVMRealOGE : uint = 3 u;
101
- const LLVMRealOLT : uint = 4 u;
102
- const LLVMRealOLE : uint = 5 u;
103
- const LLVMRealONE : uint = 6 u;
104
-
105
- const LLVMRealORD : uint = 7 u;
106
- const LLVMRealUNO : uint = 8 u;
107
- const LLVMRealUEQ : uint = 9 u;
108
- const LLVMRealUGT : uint = 10 u;
109
- const LLVMRealUGE : uint = 11 u;
110
- const LLVMRealULT : uint = 12 u;
111
- const LLVMRealULE : uint = 13 u;
112
- const LLVMRealUNE : uint = 14 u;
98
+ enum RealPredicate {
99
+ RealOEQ = 1 ,
100
+ RealOGT = 2 ,
101
+ RealOGE = 3 ,
102
+ RealOLT = 4 ,
103
+ RealOLE = 5 ,
104
+ RealONE = 6 ,
105
+ RealORD = 7 ,
106
+ RealUNO = 8 ,
107
+ RealUEQ = 9 ,
108
+ RealUGT = 10 ,
109
+ RealUGE = 11 ,
110
+ RealULT = 12 ,
111
+ RealULE = 13 ,
112
+ RealUNE = 14 ,
113
+ }
114
+
115
+ // Opaque pointer types
116
+ enum Module_opaque { }
117
+ type ModuleRef = * Module_opaque ;
118
+ enum Context_opaque { }
119
+ type ContextRef = * Context_opaque ;
120
+ enum Type_opaque { }
121
+ type TypeRef = * Type_opaque ;
122
+ enum Value_opaque { }
123
+ type ValueRef = * Value_opaque ;
124
+ enum BasicBlock_opaque { }
125
+ type BasicBlockRef = * BasicBlock_opaque ;
126
+ enum Builder_opaque { }
127
+ type BuilderRef = * Builder_opaque ;
128
+ enum MemoryBuffer_opaque { }
129
+ type MemoryBufferRef = * MemoryBuffer_opaque ;
130
+ enum PassManager_opaque { }
131
+ type PassManagerRef = * PassManager_opaque ;
132
+ enum PassManagerBuilder_opaque { }
133
+ type PassManagerBuilderRef = * PassManagerBuilder_opaque ;
134
+ enum Use_opaque { }
135
+ type UseRef = * Use_opaque ;
136
+ enum TargetData_opaque { }
137
+ type TargetDataRef = * TargetData_opaque ;
138
+ enum ObjectFile_opaque { }
139
+ type ObjectFileRef = * ObjectFile_opaque ;
140
+ enum SectionIterator_opaque { }
141
+ type SectionIteratorRef = * SectionIterator_opaque ;
113
142
114
143
#[ link_args = "-Lrustllvm" ]
115
144
#[ link_name = "rustllvm" ]
116
145
#[ abi = "cdecl" ]
117
146
native mod llvm {
118
-
119
- type ModuleRef ;
120
- type ContextRef ;
121
- type TypeRef ;
122
- type TypeHandleRef ;
123
- type ValueRef ;
124
- type BasicBlockRef ;
125
- type BuilderRef ;
126
- type ModuleProviderRef ;
127
- type MemoryBufferRef ;
128
- type PassManagerRef ;
129
- type PassManagerBuilderRef ;
130
- type UseRef ;
131
- type TargetDataRef ;
132
-
133
- /* FIXME: These are enums in the C header. Represent them how, in rust? */
134
- type Linkage ;
135
- type Attribute ;
136
- type Visibility ;
137
- type CallConv ;
138
- type IntPredicate ;
139
- type RealPredicate ;
140
- type Opcode ;
141
-
142
147
/* Create and destroy contexts. */
143
148
fn LLVMContextCreate ( ) -> ContextRef ;
144
149
fn LLVMGetGlobalContext ( ) -> ContextRef ;
@@ -422,12 +427,12 @@ native mod llvm {
422
427
/* Operations on global variables, functions, and aliases (globals) */
423
428
fn LLVMGetGlobalParent ( Global : ValueRef ) -> ModuleRef ;
424
429
fn LLVMIsDeclaration ( Global : ValueRef ) -> Bool ;
425
- fn LLVMGetLinkage ( Global : ValueRef ) -> Linkage ;
426
- fn LLVMSetLinkage ( Global : ValueRef , Link : Linkage ) ;
430
+ fn LLVMGetLinkage ( Global : ValueRef ) -> unsigned ;
431
+ fn LLVMSetLinkage ( Global : ValueRef , Link : unsigned ) ;
427
432
fn LLVMGetSection ( Global : ValueRef ) -> sbuf ;
428
433
fn LLVMSetSection ( Global : ValueRef , Section : sbuf ) ;
429
- fn LLVMGetVisibility ( Global : ValueRef ) -> Visibility ;
430
- fn LLVMSetVisibility ( Global : ValueRef , Viz : Visibility ) ;
434
+ fn LLVMGetVisibility ( Global : ValueRef ) -> unsigned ;
435
+ fn LLVMSetVisibility ( Global : ValueRef , Viz : unsigned ) ;
431
436
fn LLVMGetAlignment ( Global : ValueRef ) -> unsigned ;
432
437
fn LLVMSetAlignment ( Global : ValueRef , Bytes : unsigned ) ;
433
438
@@ -469,9 +474,9 @@ native mod llvm {
469
474
fn LLVMSetFunctionCallConv ( Fn : ValueRef , CC : unsigned ) ;
470
475
fn LLVMGetGC ( Fn : ValueRef ) -> sbuf ;
471
476
fn LLVMSetGC ( Fn : ValueRef , Name : sbuf ) ;
472
- fn LLVMAddFunctionAttr ( Fn : ValueRef , PA : Attribute , HighPA : unsigned ) ;
473
- fn LLVMGetFunctionAttr ( Fn : ValueRef ) -> Attribute ;
474
- fn LLVMRemoveFunctionAttr ( Fn : ValueRef , PA : Attribute , HighPA : unsigned ) ;
477
+ fn LLVMAddFunctionAttr ( Fn : ValueRef , PA : unsigned , HighPA : unsigned ) ;
478
+ fn LLVMGetFunctionAttr ( Fn : ValueRef ) -> unsigned ;
479
+ fn LLVMRemoveFunctionAttr ( Fn : ValueRef , PA : unsigned , HighPA : unsigned ) ;
475
480
476
481
/* Operations on parameters */
477
482
fn LLVMCountParams ( Fn : ValueRef ) -> unsigned ;
@@ -482,9 +487,9 @@ native mod llvm {
482
487
fn LLVMGetLastParam ( Fn : ValueRef ) -> ValueRef ;
483
488
fn LLVMGetNextParam ( Arg : ValueRef ) -> ValueRef ;
484
489
fn LLVMGetPreviousParam ( Arg : ValueRef ) -> ValueRef ;
485
- fn LLVMAddAttribute ( Arg : ValueRef , PA : Attribute ) ;
486
- fn LLVMRemoveAttribute ( Arg : ValueRef , PA : Attribute ) ;
487
- fn LLVMGetAttribute ( Arg : ValueRef ) -> Attribute ;
490
+ fn LLVMAddAttribute ( Arg : ValueRef , PA : unsigned ) ;
491
+ fn LLVMRemoveAttribute ( Arg : ValueRef , PA : unsigned ) ;
492
+ fn LLVMGetAttribute ( Arg : ValueRef ) -> unsigned ;
488
493
fn LLVMSetParamAlignment ( Arg : ValueRef , align : unsigned ) ;
489
494
490
495
/* Operations on basic blocks */
@@ -520,9 +525,9 @@ native mod llvm {
520
525
/* Operations on call sites */
521
526
fn LLVMSetInstructionCallConv ( Instr : ValueRef , CC : unsigned ) ;
522
527
fn LLVMGetInstructionCallConv ( Instr : ValueRef ) -> unsigned ;
523
- fn LLVMAddInstrAttribute ( Instr : ValueRef , index : unsigned , IA : Attribute ) ;
528
+ fn LLVMAddInstrAttribute ( Instr : ValueRef , index : unsigned , IA : unsigned ) ;
524
529
fn LLVMRemoveInstrAttribute ( Instr : ValueRef , index : unsigned ,
525
- IA : Attribute ) ;
530
+ IA : unsigned ) ;
526
531
fn LLVMSetInstrParamAlignment ( Instr : ValueRef , index : unsigned ,
527
532
align : unsigned ) ;
528
533
@@ -836,9 +841,6 @@ native mod llvm {
836
841
837
842
/* Stuff that's in rustllvm/ because it's not upstream yet. */
838
843
839
- type ObjectFileRef ;
840
- type SectionIteratorRef ;
841
-
842
844
/** Opens an object file. */
843
845
fn LLVMCreateObjectFile ( MemBuf : MemoryBufferRef ) -> ObjectFileRef ;
844
846
/** Closes an object file. */
@@ -907,6 +909,16 @@ native mod llvm {
907
909
fn LLVMLinkModules ( Dest : ModuleRef , Src : ModuleRef ) -> Bool ;
908
910
}
909
911
912
+ fn SetInstructionCallConv ( Instr : ValueRef , CC : CallConv ) {
913
+ llvm:: LLVMSetInstructionCallConv ( Instr , CC as unsigned ) ;
914
+ }
915
+ fn SetFunctionCallConv ( Fn : ValueRef , CC : CallConv ) {
916
+ llvm:: LLVMSetFunctionCallConv ( Fn , CC as unsigned ) ;
917
+ }
918
+ fn SetLinkage ( Global : ValueRef , Link : Linkage ) {
919
+ llvm:: LLVMSetLinkage ( Global , Link as unsigned ) ;
920
+ }
921
+
910
922
/* Memory-managed object interface to type handles. */
911
923
912
924
type type_names = @{ type_names : std:: map:: hashmap < TypeRef , str > ,
0 commit comments