@designliquido/llvm-bindings 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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +21 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +10 -0
- package/.github/dependabot.yml +12 -0
- package/.github/workflows/build.yml +156 -0
- package/.release-it.json +11 -0
- package/CHANGELOG.md +2 -0
- package/CMakeLists.txt +40 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +13 -0
- package/LICENSE +21 -0
- package/README.md +136 -0
- package/cmake/CMakeJS.cmake +57 -0
- package/cmake/LLVM.cmake +18 -0
- package/dist/index.js +4 -0
- package/include/ADT/APFloat.h +22 -0
- package/include/ADT/APInt.h +22 -0
- package/include/ADT/index.h +7 -0
- package/include/BinaryFormat/Dwarf.h +8 -0
- package/include/BinaryFormat/index.h +6 -0
- package/include/Bitcode/BitcodeWriter.h +6 -0
- package/include/Bitcode/index.h +6 -0
- package/include/Config/index.h +6 -0
- package/include/Config/llvm-config.h +6 -0
- package/include/IR/Argument.h +32 -0
- package/include/IR/Attributes.h +26 -0
- package/include/IR/BasicBlock.h +46 -0
- package/include/IR/Constant.h +36 -0
- package/include/IR/Constants.h +200 -0
- package/include/IR/DIBuilder.h +54 -0
- package/include/IR/DataLayout.h +28 -0
- package/include/IR/DebugInfoMetadata.h +408 -0
- package/include/IR/DebugLoc.h +24 -0
- package/include/IR/DerivedTypes.h +232 -0
- package/include/IR/Function.h +72 -0
- package/include/IR/GlobalObject.h +28 -0
- package/include/IR/GlobalValue.h +28 -0
- package/include/IR/GlobalVariable.h +36 -0
- package/include/IR/IRBuilder.h +280 -0
- package/include/IR/Instruction.h +36 -0
- package/include/IR/Instructions.h +1150 -0
- package/include/IR/Intrinsic.h +8 -0
- package/include/IR/LLVMContext.h +22 -0
- package/include/IR/Metadata.h +48 -0
- package/include/IR/Module.h +56 -0
- package/include/IR/Type.h +45 -0
- package/include/IR/User.h +32 -0
- package/include/IR/Value.h +40 -0
- package/include/IR/Verifier.h +8 -0
- package/include/IR/index.h +30 -0
- package/include/IRReader/IRReader.h +6 -0
- package/include/IRReader/index.h +6 -0
- package/include/Linker/Linker.h +20 -0
- package/include/Linker/index.h +6 -0
- package/include/MC/TargetRegistry.h +26 -0
- package/include/MC/index.h +6 -0
- package/include/Support/SourceMgr.h +22 -0
- package/include/Support/TargetSelect.h +6 -0
- package/include/Support/index.h +7 -0
- package/include/Target/TargetMachine.h +22 -0
- package/include/Target/index.h +6 -0
- package/include/Util/Array.h +39 -0
- package/include/Util/ErrMsg.h +586 -0
- package/include/Util/Inherit.h +5 -0
- package/include/Util/index.h +5 -0
- package/index.ts +5 -0
- package/llvm-bindings.d.ts +2233 -0
- package/package.json +72 -0
- package/src/ADT/APFloat.cpp +31 -0
- package/src/ADT/APInt.cpp +37 -0
- package/src/ADT/index.cpp +6 -0
- package/src/BinaryFormat/Dwarf.cpp +76 -0
- package/src/BinaryFormat/index.cpp +5 -0
- package/src/Bitcode/BitcodeWriter.cpp +27 -0
- package/src/Bitcode/index.cpp +5 -0
- package/src/Config/index.cpp +5 -0
- package/src/Config/llvm-config.cpp +19 -0
- package/src/IR/Argument.cpp +92 -0
- package/src/IR/Attributes.cpp +174 -0
- package/src/IR/BasicBlock.cpp +151 -0
- package/src/IR/Constants.cpp +686 -0
- package/src/IR/DIBuilder.cpp +328 -0
- package/src/IR/DataLayout.cpp +59 -0
- package/src/IR/DebugInfoMetadata.cpp +961 -0
- package/src/IR/DebugLoc.cpp +44 -0
- package/src/IR/DerivedTypes.cpp +652 -0
- package/src/IR/Function.cpp +279 -0
- package/src/IR/GlobalObject.cpp +59 -0
- package/src/IR/GlobalValue.cpp +75 -0
- package/src/IR/GlobalVariable.cpp +122 -0
- package/src/IR/IRBuilder.cpp +843 -0
- package/src/IR/Instruction.cpp +190 -0
- package/src/IR/Instructions.cpp +2866 -0
- package/src/IR/Intrinsic.cpp +352 -0
- package/src/IR/LLVMContext.cpp +30 -0
- package/src/IR/Metadata.cpp +107 -0
- package/src/IR/Module.cpp +228 -0
- package/src/IR/Type.cpp +278 -0
- package/src/IR/User.cpp +81 -0
- package/src/IR/Value.cpp +103 -0
- package/src/IR/Verifier.cpp +28 -0
- package/src/IR/index.cpp +108 -0
- package/src/IRReader/IRReader.cpp +19 -0
- package/src/IRReader/index.cpp +5 -0
- package/src/Linker/Linker.cpp +45 -0
- package/src/Linker/index.cpp +5 -0
- package/src/MC/TargetRegistry.cpp +88 -0
- package/src/MC/index.cpp +6 -0
- package/src/Support/SourceMgr.cpp +31 -0
- package/src/Support/TargetSelect.cpp +54 -0
- package/src/Support/index.cpp +6 -0
- package/src/Target/TargetMachine.cpp +37 -0
- package/src/Target/index.cpp +5 -0
- package/src/Util/Inherit.cpp +13 -0
- package/src/llvm-bindings.cpp +26 -0
- package/test/add.ts +32 -0
- package/test/attribute.ts +37 -0
- package/test/bitcode/add.bc +0 -0
- package/test/bitcodeWriter.ts +44 -0
- package/test/class.ts +39 -0
- package/test/debugInfo.ts +181 -0
- package/test/exception.ts +57 -0
- package/test/fibonacci.ts +44 -0
- package/test/gep.ts +42 -0
- package/test/index.ts +33 -0
- package/test/intrinsic.ts +35 -0
- package/test/linker.ts +48 -0
- package/test/str.ts +19 -0
- package/test/switch.ts +58 -0
- package/test/target.ts +14 -0
- package/test/type.ts +21 -0
- package/test/unary.ts +53 -0
- package/test/variable.ts +37 -0
- package/tests/Bitcode/BitcodeWriter.spec.ts +26 -0
- package/tests/Config/llvm-config.spec.ts +13 -0
- package/tests/IR/LLVMContext.spec.ts +8 -0
- package/tests/IR/Module.spec.ts +362 -0
- package/tests/IR/__snapshots__/Module.spec.ts.snap +11 -0
- package/tests/Support/TargetRegistry.spec.ts +38 -0
- package/tests/Support/TargetSelect.spec.ts +19 -0
- package/tests/Target/TargetMachine.spec.ts +19 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
#include "IR/index.h"
|
|
2
|
+
#include "Util/index.h"
|
|
3
|
+
|
|
4
|
+
void Function::Init(Napi::Env env, Napi::Object &exports) {
|
|
5
|
+
Napi::HandleScope scope(env);
|
|
6
|
+
Napi::Function func = DefineClass(env, "Function", {
|
|
7
|
+
StaticMethod("Create", &Function::Create),
|
|
8
|
+
InstanceMethod("arg_size", &Function::argSize),
|
|
9
|
+
InstanceMethod("getArg", &Function::getArg),
|
|
10
|
+
InstanceMethod("getReturnType", &Function::getReturnType),
|
|
11
|
+
InstanceMethod("addBasicBlock", &Function::addBasicBlock),
|
|
12
|
+
InstanceMethod("getEntryBlock", &Function::getEntryBlock),
|
|
13
|
+
InstanceMethod("getExitBlock", &Function::getExitBlock),
|
|
14
|
+
InstanceMethod("insertAfter", &Function::insertAfter),
|
|
15
|
+
InstanceMethod("deleteBody", &Function::deleteBody),
|
|
16
|
+
InstanceMethod("removeFromParent", &Function::removeFromParent),
|
|
17
|
+
InstanceMethod("eraseFromParent", &Function::eraseFromParent),
|
|
18
|
+
InstanceMethod("use_empty", &Function::useEmpty),
|
|
19
|
+
InstanceMethod("user_empty", &Function::userEmpty),
|
|
20
|
+
InstanceMethod("getNumUses", &Function::getNumUses),
|
|
21
|
+
InstanceMethod("removeDeadConstantUsers", &Function::removeDeadConstantUsers),
|
|
22
|
+
InstanceMethod("hasPersonalityFn", &Function::hasPersonalityFn),
|
|
23
|
+
InstanceMethod("setPersonalityFn", &Function::setPersonalityFn),
|
|
24
|
+
InstanceMethod("setDoesNotThrow", &Function::setDoesNotThrow),
|
|
25
|
+
InstanceMethod("setSubprogram", &Function::setSubprogram),
|
|
26
|
+
InstanceMethod("getSubprogram", &Function::getSubprogram),
|
|
27
|
+
InstanceMethod("getType", &Function::getType),
|
|
28
|
+
InstanceMethod("addFnAttr", &Function::addFnAttr),
|
|
29
|
+
InstanceMethod("addParamAttr", &Function::addParamAttr),
|
|
30
|
+
InstanceMethod("addRetAttr", &Function::addRetAttr)
|
|
31
|
+
});
|
|
32
|
+
constructor = Napi::Persistent(func);
|
|
33
|
+
constructor.SuppressDestruct();
|
|
34
|
+
Inherit(env, constructor.Value(), GlobalObject::constructor.Value());
|
|
35
|
+
exports.Set("Function", func);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Napi::Object Function::New(Napi::Env env, llvm::Function *function) {
|
|
39
|
+
return constructor.New({Napi::External<llvm::Function>::New(env, function)});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
bool Function::IsClassOf(const Napi::Value &value) {
|
|
43
|
+
return value.IsNull() || value.As<Napi::Object>().InstanceOf(constructor.Value());
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
llvm::Function *Function::Extract(const Napi::Value &value) {
|
|
47
|
+
if (value.IsNull()) {
|
|
48
|
+
return nullptr;
|
|
49
|
+
}
|
|
50
|
+
return Unwrap(value.As<Napi::Object>())->getLLVMPrimitive();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
Function::Function(const Napi::CallbackInfo &info) : ObjectWrap(info) {
|
|
54
|
+
Napi::Env env = info.Env();
|
|
55
|
+
if (!info.IsConstructCall() || info.Length() == 0 || !info[0].IsExternal()) {
|
|
56
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::Create);
|
|
57
|
+
}
|
|
58
|
+
auto external = info[0].As<Napi::External<llvm::Function>>();
|
|
59
|
+
function = external.Data();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
Napi::Value Function::Create(const Napi::CallbackInfo &info) {
|
|
63
|
+
Napi::Env env = info.Env();
|
|
64
|
+
unsigned argsLen = info.Length();
|
|
65
|
+
if (argsLen < 2 ||
|
|
66
|
+
!FunctionType::IsClassOf(info[0]) ||
|
|
67
|
+
!info[1].IsNumber() ||
|
|
68
|
+
argsLen >= 3 && !info[2].IsString() ||
|
|
69
|
+
argsLen >= 4 && !Module::IsClassOf(info[3])) {
|
|
70
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::Create);
|
|
71
|
+
}
|
|
72
|
+
llvm::FunctionType *funcType = FunctionType::Extract(info[0]);
|
|
73
|
+
llvm::GlobalValue::LinkageTypes linkage = static_cast<llvm::GlobalValue::LinkageTypes>(info[1].As<Napi::Number>().Uint32Value());
|
|
74
|
+
std::string name;
|
|
75
|
+
llvm::Module *module = nullptr;
|
|
76
|
+
if (argsLen >= 3) {
|
|
77
|
+
name = info[2].As<Napi::String>();
|
|
78
|
+
}
|
|
79
|
+
if (argsLen >= 4) {
|
|
80
|
+
module = Module::Extract(info[3]);
|
|
81
|
+
}
|
|
82
|
+
llvm::Function *function = llvm::Function::Create(funcType, linkage, static_cast<unsigned>(-1), name, module);
|
|
83
|
+
return Function::New(env, function);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
llvm::Function *Function::getLLVMPrimitive() {
|
|
87
|
+
return function;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Napi::Value Function::argSize(const Napi::CallbackInfo &info) {
|
|
91
|
+
Napi::Env env = info.Env();
|
|
92
|
+
return Napi::Number::New(env, double(function->arg_size()));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
Napi::Value Function::getArg(const Napi::CallbackInfo &info) {
|
|
96
|
+
Napi::Env env = info.Env();
|
|
97
|
+
if (info.Length() >= 1 && info[0].IsNumber()) {
|
|
98
|
+
llvm::Argument *arg = function->getArg(info[0].As<Napi::Number>());
|
|
99
|
+
return Argument::New(env, arg);
|
|
100
|
+
}
|
|
101
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::getArg);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
Napi::Value Function::getReturnType(const Napi::CallbackInfo &info) {
|
|
105
|
+
return Type::New(info.Env(), function->getReturnType());
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void Function::addBasicBlock(const Napi::CallbackInfo &info) {
|
|
109
|
+
Napi::Env env = info.Env();
|
|
110
|
+
if (info.Length() == 0 || !BasicBlock::IsClassOf(info[0])) {
|
|
111
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::addBasicBlock);
|
|
112
|
+
}
|
|
113
|
+
llvm::BasicBlock *basicBlock = BasicBlock::Extract(info[0]);
|
|
114
|
+
function->getBasicBlockList().push_back(basicBlock);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
Napi::Value Function::getEntryBlock(const Napi::CallbackInfo &info) {
|
|
118
|
+
return BasicBlock::New(info.Env(), &(function->getEntryBlock()));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
Napi::Value Function::getExitBlock(const Napi::CallbackInfo &info) {
|
|
122
|
+
return BasicBlock::New(info.Env(), &(function->back()));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
void Function::insertAfter(const Napi::CallbackInfo &info) {
|
|
126
|
+
Napi::Env env = info.Env();
|
|
127
|
+
if (info.Length() < 2 || !BasicBlock::IsClassOf(info[0]) || !BasicBlock::IsClassOf(info[1])) {
|
|
128
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::insertAfter);
|
|
129
|
+
}
|
|
130
|
+
llvm::BasicBlock *where = BasicBlock::Extract(info[0]);
|
|
131
|
+
llvm::BasicBlock *bb = BasicBlock::Extract(info[1]);
|
|
132
|
+
function->getBasicBlockList().insertAfter(where->getIterator(), bb);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
void Function::deleteBody(const Napi::CallbackInfo &info) {
|
|
136
|
+
function->deleteBody();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
void Function::removeFromParent(const Napi::CallbackInfo &info) {
|
|
140
|
+
function->removeFromParent();
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void Function::eraseFromParent(const Napi::CallbackInfo &info) {
|
|
144
|
+
function->eraseFromParent();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
Napi::Value Function::useEmpty(const Napi::CallbackInfo &info) {
|
|
148
|
+
return Napi::Boolean::New(info.Env(), function->use_empty());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
Napi::Value Function::userEmpty(const Napi::CallbackInfo &info) {
|
|
152
|
+
return Napi::Boolean::New(info.Env(), function->user_empty());
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
Napi::Value Function::getNumUses(const Napi::CallbackInfo &info) {
|
|
156
|
+
return Napi::Number::New(info.Env(), function->getNumUses());
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
void Function::removeDeadConstantUsers(const Napi::CallbackInfo &info) {
|
|
160
|
+
function->removeDeadConstantUsers();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
Napi::Value Function::hasPersonalityFn(const Napi::CallbackInfo &info) {
|
|
164
|
+
return Napi::Boolean::New(info.Env(), function->hasPersonalityFn());
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
void Function::setPersonalityFn(const Napi::CallbackInfo &info) {
|
|
168
|
+
Napi::Env env = info.Env();
|
|
169
|
+
if (info.Length() == 1 && Constant::IsClassOf(info[0])) {
|
|
170
|
+
llvm::Constant *fn = Constant::Extract(info[0]);
|
|
171
|
+
function->setPersonalityFn(fn);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::setPersonalityFn);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
void Function::setDoesNotThrow(const Napi::CallbackInfo &info) {
|
|
178
|
+
function->setDoesNotThrow();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
void Function::setSubprogram(const Napi::CallbackInfo &info) {
|
|
182
|
+
Napi::Env env = info.Env();
|
|
183
|
+
if (info.Length() == 1 && DISubprogram::IsClassOf(info[0])) {
|
|
184
|
+
llvm::DISubprogram *subprogram = DISubprogram::Extract(info[0]);
|
|
185
|
+
function->setSubprogram(subprogram);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::setSubprogram);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
Napi::Value Function::getSubprogram(const Napi::CallbackInfo &info) {
|
|
192
|
+
return DISubprogram::New(info.Env(), function->getSubprogram());
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
Napi::Value Function::getType(const Napi::CallbackInfo &info) {
|
|
196
|
+
Napi::Env env = info.Env();
|
|
197
|
+
llvm::PointerType *type = function->getType();
|
|
198
|
+
return PointerType::New(env, type);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
void Function::addFnAttr(const Napi::CallbackInfo &info) {
|
|
202
|
+
Napi::Env env = info.Env();
|
|
203
|
+
|
|
204
|
+
unsigned argsLen = info.Length();
|
|
205
|
+
|
|
206
|
+
if (argsLen >= 1 && argsLen <= 2) {
|
|
207
|
+
if (argsLen == 1 && info[0].IsNumber()) {
|
|
208
|
+
unsigned rawAttrKind = info[0].As<Napi::Number>();
|
|
209
|
+
if (rawAttrKind < llvm::Attribute::AttrKind::FirstEnumAttr ||
|
|
210
|
+
rawAttrKind > llvm::Attribute::AttrKind::LastEnumAttr) {
|
|
211
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Attribute::invalidAttrKind);
|
|
212
|
+
}
|
|
213
|
+
function->addFnAttr(static_cast<llvm::Attribute::AttrKind>(rawAttrKind));
|
|
214
|
+
return;
|
|
215
|
+
} else if (argsLen == 1 && Attribute::IsClassOf(info[0])) {
|
|
216
|
+
llvm::Attribute attr = Attribute::Extract(info[0]);
|
|
217
|
+
function->addFnAttr(attr);
|
|
218
|
+
return;
|
|
219
|
+
} else if (info[0].IsString()) {
|
|
220
|
+
std::string attrKind = info[0].As<Napi::String>();
|
|
221
|
+
if (argsLen == 1) {
|
|
222
|
+
function->addFnAttr(attrKind);
|
|
223
|
+
return;
|
|
224
|
+
} else if (argsLen == 2 && info[1].IsString()) {
|
|
225
|
+
std::string value = info[1].As<Napi::String>();
|
|
226
|
+
function->addFnAttr(attrKind, value);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::addFnAttr);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
void Function::addParamAttr(const Napi::CallbackInfo &info) {
|
|
236
|
+
Napi::Env env = info.Env();
|
|
237
|
+
|
|
238
|
+
if (info.Length() == 2 && info[0].IsNumber()) {
|
|
239
|
+
unsigned argNo = info[0].As<Napi::Number>();
|
|
240
|
+
|
|
241
|
+
if (info[1].IsNumber()) {
|
|
242
|
+
unsigned rawAttrKind = info[1].As<Napi::Number>();
|
|
243
|
+
if (rawAttrKind < llvm::Attribute::AttrKind::FirstEnumAttr ||
|
|
244
|
+
rawAttrKind > llvm::Attribute::AttrKind::LastEnumAttr) {
|
|
245
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Attribute::invalidAttrKind);
|
|
246
|
+
}
|
|
247
|
+
function->addParamAttr(argNo, static_cast<llvm::Attribute::AttrKind>(rawAttrKind));
|
|
248
|
+
return;
|
|
249
|
+
} else if (Attribute::IsClassOf(info[1])) {
|
|
250
|
+
llvm::Attribute attr = Attribute::Extract(info[1]);
|
|
251
|
+
function->addParamAttr(argNo, attr);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::addParamAttr);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
void Function::addRetAttr(const Napi::CallbackInfo &info) {
|
|
260
|
+
Napi::Env env = info.Env();
|
|
261
|
+
|
|
262
|
+
if (info.Length() == 1) {
|
|
263
|
+
if (info[0].IsNumber()) {
|
|
264
|
+
unsigned rawAttrKind = info[0].As<Napi::Number>();
|
|
265
|
+
if (rawAttrKind < llvm::Attribute::AttrKind::FirstEnumAttr ||
|
|
266
|
+
rawAttrKind > llvm::Attribute::AttrKind::LastEnumAttr) {
|
|
267
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Attribute::invalidAttrKind);
|
|
268
|
+
}
|
|
269
|
+
function->addRetAttr(static_cast<llvm::Attribute::AttrKind>(rawAttrKind));
|
|
270
|
+
return;
|
|
271
|
+
} else if (Attribute::IsClassOf(info[0])) {
|
|
272
|
+
llvm::Attribute attr = Attribute::Extract(info[0]);
|
|
273
|
+
function->addRetAttr(attr);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::Function::addRetAttr);
|
|
279
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#include "IR/index.h"
|
|
2
|
+
#include "Util/index.h"
|
|
3
|
+
|
|
4
|
+
void GlobalObject::Init(Napi::Env env, Napi::Object &exports) {
|
|
5
|
+
Napi::HandleScope scope(env);
|
|
6
|
+
Napi::Function func = DefineClass(env, "GlobalObject", {
|
|
7
|
+
InstanceMethod("getType", &GlobalObject::getType),
|
|
8
|
+
InstanceMethod("getValueType", &GlobalObject::getValueType)
|
|
9
|
+
});
|
|
10
|
+
constructor = Napi::Persistent(func);
|
|
11
|
+
constructor.SuppressDestruct();
|
|
12
|
+
Inherit(env, constructor.Value(), GlobalValue::constructor.Value());
|
|
13
|
+
exports.Set("GlobalObject", func);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
Napi::Object GlobalObject::New(Napi::Env env, llvm::GlobalObject *globalObject) {
|
|
17
|
+
if (llvm::isa<llvm::Function>(globalObject)) {
|
|
18
|
+
return Function::New(env, llvm::cast<llvm::Function>(globalObject));
|
|
19
|
+
} else if (llvm::isa<llvm::GlobalVariable>(globalObject)) {
|
|
20
|
+
return GlobalVariable::New(env, llvm::cast<llvm::GlobalVariable>(globalObject));
|
|
21
|
+
}
|
|
22
|
+
return constructor.New({Napi::External<llvm::GlobalObject>::New(env, globalObject)});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
bool GlobalObject::IsClassOf(const Napi::Value &value) {
|
|
26
|
+
return value.IsNull() || value.As<Napi::Object>().InstanceOf(constructor.Value());
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
llvm::GlobalObject *GlobalObject::Extract(const Napi::Value &value) {
|
|
30
|
+
if (value.IsNull()) {
|
|
31
|
+
return nullptr;
|
|
32
|
+
}
|
|
33
|
+
return Unwrap(value.As<Napi::Object>())->getLLVMPrimitive();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
GlobalObject::GlobalObject(const Napi::CallbackInfo &info) : ObjectWrap(info) {
|
|
37
|
+
Napi::Env env = info.Env();
|
|
38
|
+
if (!info.IsConstructCall() || info.Length() == 0 || !info[0].IsExternal()) {
|
|
39
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::GlobalObject::constructor);
|
|
40
|
+
}
|
|
41
|
+
auto external = info[0].As<Napi::External<llvm::GlobalObject>>();
|
|
42
|
+
globalObject = external.Data();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
llvm::GlobalObject *GlobalObject::getLLVMPrimitive() {
|
|
46
|
+
return globalObject;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
Napi::Value GlobalObject::getType(const Napi::CallbackInfo &info) {
|
|
50
|
+
Napi::Env env = info.Env();
|
|
51
|
+
llvm::PointerType *type = globalObject->getType();
|
|
52
|
+
return PointerType::New(env, type);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
Napi::Value GlobalObject::getValueType(const Napi::CallbackInfo &info) {
|
|
56
|
+
Napi::Env env = info.Env();
|
|
57
|
+
llvm::Type *type = globalObject->getValueType();
|
|
58
|
+
return Type::New(env, type);
|
|
59
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#include "IR/index.h"
|
|
2
|
+
#include "Util/index.h"
|
|
3
|
+
|
|
4
|
+
void GlobalValue::Init(Napi::Env env, Napi::Object &exports) {
|
|
5
|
+
Napi::HandleScope scope(env);
|
|
6
|
+
Napi::Object linkageTypes = Napi::Object::New(env);
|
|
7
|
+
linkageTypes.Set("ExternalLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::ExternalLinkage));
|
|
8
|
+
linkageTypes.Set("AvailableExternallyLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::AvailableExternallyLinkage));
|
|
9
|
+
linkageTypes.Set("LinkOnceAnyLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::LinkOnceAnyLinkage));
|
|
10
|
+
linkageTypes.Set("LinkOnceODRLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::LinkOnceODRLinkage));
|
|
11
|
+
linkageTypes.Set("WeakAnyLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::WeakAnyLinkage));
|
|
12
|
+
linkageTypes.Set("WeakODRLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::WeakODRLinkage));
|
|
13
|
+
linkageTypes.Set("AppendingLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::AppendingLinkage));
|
|
14
|
+
linkageTypes.Set("InternalLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::InternalLinkage));
|
|
15
|
+
linkageTypes.Set("PrivateLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::PrivateLinkage));
|
|
16
|
+
linkageTypes.Set("ExternalWeakLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::ExternalWeakLinkage));
|
|
17
|
+
linkageTypes.Set("CommonLinkage", Napi::Number::New(env, llvm::GlobalValue::LinkageTypes::CommonLinkage));
|
|
18
|
+
Napi::Object visibilityTypes = Napi::Object::New(env);
|
|
19
|
+
visibilityTypes.Set("DefaultVisibility", Napi::Number::New(env, llvm::GlobalValue::VisibilityTypes::DefaultVisibility));
|
|
20
|
+
visibilityTypes.Set("HiddenVisibility", Napi::Number::New(env, llvm::GlobalValue::VisibilityTypes::HiddenVisibility));
|
|
21
|
+
visibilityTypes.Set("ProtectedVisibility", Napi::Number::New(env, llvm::GlobalValue::VisibilityTypes::ProtectedVisibility));
|
|
22
|
+
Napi::Function func = DefineClass(env, "GlobalValue", {
|
|
23
|
+
StaticValue("LinkageTypes", linkageTypes),
|
|
24
|
+
StaticValue("VisibilityTypes", visibilityTypes),
|
|
25
|
+
InstanceMethod("getType", &GlobalValue::getType),
|
|
26
|
+
InstanceMethod("getValueType", &GlobalValue::getValueType)
|
|
27
|
+
});
|
|
28
|
+
constructor = Napi::Persistent(func);
|
|
29
|
+
constructor.SuppressDestruct();
|
|
30
|
+
Inherit(env, constructor.Value(), Constant::constructor.Value());
|
|
31
|
+
exports.Set("GlobalValue", func);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
Napi::Object GlobalValue::New(Napi::Env env, llvm::GlobalValue *globalValue) {
|
|
35
|
+
if (llvm::isa<llvm::GlobalObject>(globalValue)) {
|
|
36
|
+
return GlobalObject::New(env, llvm::cast<llvm::GlobalObject>(globalValue));
|
|
37
|
+
}
|
|
38
|
+
return constructor.New({Napi::External<llvm::GlobalValue>::New(env, globalValue)});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
bool GlobalValue::IsClassOf(const Napi::Value &value) {
|
|
42
|
+
return value.IsNull() || value.As<Napi::Object>().InstanceOf(constructor.Value());
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
llvm::GlobalValue *GlobalValue::Extract(const Napi::Value &value) {
|
|
46
|
+
if (value.IsNull()) {
|
|
47
|
+
return nullptr;
|
|
48
|
+
}
|
|
49
|
+
return Unwrap(value.As<Napi::Object>())->getLLVMPrimitive();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
GlobalValue::GlobalValue(const Napi::CallbackInfo &info) : ObjectWrap(info) {
|
|
53
|
+
Napi::Env env = info.Env();
|
|
54
|
+
if (!info.IsConstructCall() || info.Length() == 0 || !info[0].IsExternal()) {
|
|
55
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::GlobalValue::constructor);
|
|
56
|
+
}
|
|
57
|
+
auto external = info[0].As<Napi::External<llvm::GlobalValue>>();
|
|
58
|
+
globalValue = external.Data();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
llvm::GlobalValue *GlobalValue::getLLVMPrimitive() {
|
|
62
|
+
return globalValue;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
Napi::Value GlobalValue::getType(const Napi::CallbackInfo &info) {
|
|
66
|
+
Napi::Env env = info.Env();
|
|
67
|
+
llvm::PointerType *type = globalValue->getType();
|
|
68
|
+
return PointerType::New(env, type);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
Napi::Value GlobalValue::getValueType(const Napi::CallbackInfo &info) {
|
|
72
|
+
Napi::Env env = info.Env();
|
|
73
|
+
llvm::Type *type = globalValue->getValueType();
|
|
74
|
+
return Type::New(env, type);
|
|
75
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#include "IR/index.h"
|
|
2
|
+
#include "Util/index.h"
|
|
3
|
+
|
|
4
|
+
void GlobalVariable::Init(Napi::Env env, Napi::Object &exports) {
|
|
5
|
+
Napi::HandleScope scope(env);
|
|
6
|
+
Napi::Function func = DefineClass(env, "GlobalVariable", {
|
|
7
|
+
InstanceMethod("getType", &GlobalVariable::getType),
|
|
8
|
+
InstanceMethod("getValueType", &GlobalVariable::getValueType),
|
|
9
|
+
InstanceMethod("setInitializer", &GlobalVariable::setInitializer),
|
|
10
|
+
InstanceMethod("removeFromParent", &GlobalVariable::removeFromParent),
|
|
11
|
+
InstanceMethod("eraseFromParent", &GlobalVariable::eraseFromParent),
|
|
12
|
+
InstanceMethod("addDebugInfo", &GlobalVariable::addDebugInfo)
|
|
13
|
+
});
|
|
14
|
+
constructor = Napi::Persistent(func);
|
|
15
|
+
constructor.SuppressDestruct();
|
|
16
|
+
Inherit(env, constructor.Value(), GlobalObject::constructor.Value());
|
|
17
|
+
exports.Set("GlobalVariable", func);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
Napi::Object GlobalVariable::New(Napi::Env env, llvm::GlobalVariable *variable) {
|
|
21
|
+
return constructor.New({Napi::External<llvm::GlobalVariable>::New(env, variable)});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
bool GlobalVariable::IsClassOf(const Napi::Value &value) {
|
|
25
|
+
return value.IsNull() || value.As<Napi::Object>().InstanceOf(constructor.Value());
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
llvm::GlobalVariable *GlobalVariable::Extract(const Napi::Value &value) {
|
|
29
|
+
if (value.IsNull()) {
|
|
30
|
+
return nullptr;
|
|
31
|
+
}
|
|
32
|
+
return Unwrap(value.As<Napi::Object>())->getLLVMPrimitive();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
GlobalVariable::GlobalVariable(const Napi::CallbackInfo &info) : ObjectWrap(info) {
|
|
36
|
+
Napi::Env env = info.Env();
|
|
37
|
+
if (!info.IsConstructCall()) {
|
|
38
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::GlobalVariable::constructor);
|
|
39
|
+
}
|
|
40
|
+
unsigned argsLen = info.Length();
|
|
41
|
+
if (argsLen >= 1 && info[0].IsExternal()) {
|
|
42
|
+
auto external = info[0].As<Napi::External<llvm::GlobalVariable>>();
|
|
43
|
+
globalVariable = external.Data();
|
|
44
|
+
return;
|
|
45
|
+
} else if (argsLen >= 3 &&
|
|
46
|
+
Type::IsClassOf(info[0]) &&
|
|
47
|
+
info[1].IsBoolean() &&
|
|
48
|
+
info[2].IsNumber()) {
|
|
49
|
+
if (argsLen == 3 ||
|
|
50
|
+
argsLen >= 4 && Constant::IsClassOf(info[3]) ||
|
|
51
|
+
argsLen >= 5 && info[4].IsString()) {
|
|
52
|
+
llvm::Type *type = Type::Extract(info[0]);
|
|
53
|
+
bool isConstant = info[1].As<Napi::Boolean>();
|
|
54
|
+
llvm::GlobalValue::LinkageTypes linkage = static_cast<llvm::GlobalValue::LinkageTypes>(info[2].As<Napi::Number>().Uint32Value());
|
|
55
|
+
llvm::Constant *initializer = argsLen >= 4 ? Constant::Extract(info[3]) : nullptr;
|
|
56
|
+
std::string name = argsLen >= 5 ? std::string(info[4].As<Napi::String>()) : "";
|
|
57
|
+
globalVariable = new llvm::GlobalVariable(type, isConstant, linkage, initializer, name);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
} else if (argsLen >= 5 &&
|
|
61
|
+
Module::IsClassOf(info[0]) &&
|
|
62
|
+
Type::IsClassOf(info[1]) &&
|
|
63
|
+
info[2].IsBoolean() &&
|
|
64
|
+
info[3].IsNumber() &&
|
|
65
|
+
Constant::IsClassOf(info[4])) {
|
|
66
|
+
if (argsLen == 5 || argsLen >= 6 && info[5].IsString()) {
|
|
67
|
+
llvm::Module *module = Module::Extract(info[0]);
|
|
68
|
+
llvm::Type *type = Type::Extract(info[1]);
|
|
69
|
+
bool isConstant = info[2].As<Napi::Boolean>();
|
|
70
|
+
llvm::GlobalValue::LinkageTypes linkage = static_cast<llvm::GlobalValue::LinkageTypes>(info[3].As<Napi::Number>().Uint32Value());
|
|
71
|
+
llvm::Constant *initializer = Constant::Extract(info[4]);
|
|
72
|
+
std::string name = argsLen >= 6 ? std::string(info[5].As<Napi::String>()) : "";
|
|
73
|
+
globalVariable = new llvm::GlobalVariable(*module, type, isConstant, linkage, initializer, name);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::GlobalVariable::constructor);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
llvm::GlobalVariable *GlobalVariable::getLLVMPrimitive() {
|
|
81
|
+
return globalVariable;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
Napi::Value GlobalVariable::getType(const Napi::CallbackInfo &info) {
|
|
85
|
+
Napi::Env env = info.Env();
|
|
86
|
+
llvm::PointerType *type = globalVariable->getType();
|
|
87
|
+
return PointerType::New(env, type);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Napi::Value GlobalVariable::getValueType(const Napi::CallbackInfo &info) {
|
|
91
|
+
Napi::Env env = info.Env();
|
|
92
|
+
llvm::Type *type = globalVariable->getValueType();
|
|
93
|
+
return Type::New(env, type);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
void GlobalVariable::setInitializer(const Napi::CallbackInfo &info) {
|
|
97
|
+
Napi::Env env = info.Env();
|
|
98
|
+
if (info.Length() == 1 && Constant::IsClassOf(info[0])) {
|
|
99
|
+
llvm::Constant *initVal = Constant::Extract(info[0]);
|
|
100
|
+
globalVariable->setInitializer(initVal);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::GlobalVariable::setInitializer);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
void GlobalVariable::removeFromParent(const Napi::CallbackInfo &info) {
|
|
107
|
+
globalVariable->removeFromParent();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
void GlobalVariable::eraseFromParent(const Napi::CallbackInfo &info) {
|
|
111
|
+
globalVariable->eraseFromParent();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
void GlobalVariable::addDebugInfo(const Napi::CallbackInfo &info) {
|
|
115
|
+
Napi::Env env = info.Env();
|
|
116
|
+
if (info.Length() == 1 && DIGlobalVariableExpression::IsClassOf(info[0])) {
|
|
117
|
+
llvm::DIGlobalVariableExpression *gv = DIGlobalVariableExpression::Extract(info[0]);
|
|
118
|
+
globalVariable->addDebugInfo(gv);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
throw Napi::TypeError::New(env, ErrMsg::Class::GlobalVariable::addDebugInfo);
|
|
122
|
+
}
|