Skip to content

Commit f50ee45

Browse files
committed
feat: basic code generation
feat: add packed flag to StructType feat: add CallingConv to Function
1 parent 69c93f7 commit f50ee45

27 files changed

+983
-10
lines changed

include/IR/CallingConv.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
#include <napi.h>
4+
5+
namespace CallingConv {
6+
void Init(Napi::Env env, Napi::Object &exports);
7+
}

include/IR/Function.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ class Function : public Napi::ObjectWrap<Function> {
6464

6565
Napi::Value getType(const Napi::CallbackInfo &info);
6666

67+
Napi::Value getCallingConv(const Napi::CallbackInfo &info);
68+
69+
void setCallingConv(const Napi::CallbackInfo &info);
70+
6771
void addFnAttr(const Napi::CallbackInfo &info);
6872

6973
void addParamAttr(const Napi::CallbackInfo &info);

include/IR/PassManager.h

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#pragma once
2+
3+
#include <napi.h>
4+
5+
#include <llvm/IR/PassManager.h>
6+
#include "llvm/Pass.h"
7+
#include "llvm/Passes/PassBuilder.h"
8+
9+
class ModulePassManager : public Napi::ObjectWrap<ModulePassManager> {
10+
public:
11+
static inline Napi::FunctionReference constructor; // NOLINT
12+
13+
static void Init(Napi::Env env, Napi::Object &exports);
14+
15+
static bool IsClassOf(const Napi::Value &value);
16+
17+
static llvm::ModulePassManager *Extract(const Napi::Value &value);
18+
19+
explicit ModulePassManager(const Napi::CallbackInfo &info);
20+
21+
llvm::ModulePassManager *getLLVMPrimitive();
22+
23+
private:
24+
llvm::ModulePassManager *passManager;
25+
26+
llvm::PassBuilder *passBuilder;
27+
llvm::ModuleAnalysisManager *moduleAnalysisManager;
28+
llvm::LoopAnalysisManager *loopAnalysisManager;
29+
llvm::FunctionAnalysisManager *functionAnalysisManager;
30+
llvm::CGSCCAnalysisManager *cgsccAnalysisManager;
31+
32+
llvm::OptimizationLevel level;
33+
34+
Napi::Value createFunctionPassManager(const Napi::CallbackInfo &info);
35+
void addFunctionPasses(const Napi::CallbackInfo &info);
36+
void addVerifierPass(const Napi::CallbackInfo &info);
37+
Napi::Value isEmpty(const Napi::CallbackInfo &info);
38+
39+
void run(const Napi::CallbackInfo &info);
40+
};
41+
42+
class FunctionPassManager : public Napi::ObjectWrap<FunctionPassManager> {
43+
public:
44+
static inline Napi::FunctionReference constructor; // NOLINT
45+
46+
static void Init(Napi::Env env, Napi::Object &exports);
47+
48+
static Napi::Object New(Napi::Env env, llvm::FunctionPassManager *fpm);
49+
50+
static bool IsClassOf(const Napi::Value &value);
51+
52+
static llvm::FunctionPassManager *Extract(const Napi::Value &value);
53+
54+
explicit FunctionPassManager(const Napi::CallbackInfo &info);
55+
56+
llvm::FunctionPassManager *getLLVMPrimitive();
57+
58+
private:
59+
llvm::FunctionPassManager *passManager = nullptr;
60+
61+
void addSROAPass(const Napi::CallbackInfo &info);
62+
void addEarlyCSEPass(const Napi::CallbackInfo &info);
63+
void addInstCombinePass(const Napi::CallbackInfo &info);
64+
65+
Napi::Value isEmpty(const Napi::CallbackInfo &info);
66+
};

include/IR/index.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "IR/GlobalObject.h"
1717
#include "IR/GlobalVariable.h"
1818
#include "IR/Function.h"
19+
#include "IR/CallingConv.h"
1920
#include "IR/Instruction.h"
2021
#include "IR/Instructions.h"
2122
#include "IR/IRBuilder.h"
@@ -26,5 +27,6 @@
2627
#include "IR/DataLayout.h"
2728
#include "IR/Verifier.h"
2829
#include "IR/Intrinsic.h"
30+
#include "IR/PassManager.h"
2931

3032
void InitIR(Napi::Env env, Napi::Object &exports);

include/Passes/OptimizationLevel.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <napi.h>
4+
5+
namespace OptimizationLevel {
6+
enum Level {
7+
O0,
8+
O1,
9+
O2,
10+
O3,
11+
Os,
12+
Oz,
13+
};
14+
15+
void Init(Napi::Env env, Napi::Object &exports);
16+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
#include <napi.h>
4+
5+
namespace ThinOrFullLTOPhase {
6+
void Init(Napi::Env env, Napi::Object &exports);
7+
}

include/Passes/index.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
#include <napi.h>
4+
#include "Passes/OptimizationLevel.h"
5+
#include "Passes/ThinOrFullLTOPhase.h"
6+
7+
void InitPasses(Napi::Env env, Napi::Object &exports);

include/Support/CodeGen.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#pragma once
2+
3+
#include <napi.h>
4+
5+
namespace CodeGen {
6+
void Init(Napi::Env env, Napi::Object &exports);
7+
}

include/Support/index.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
#include <napi.h>
44
#include "Support/SourceMgr.h"
55
#include "Support/TargetSelect.h"
6+
#include "Support/CodeGen.h"
67

78
void InitSupport(Napi::Env env, Napi::Object &exports);

include/Target/TargetMachine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ class TargetMachine : public Napi::ObjectWrap<TargetMachine> {
1919
const llvm::TargetMachine *targetMachine = nullptr;
2020

2121
Napi::Value createDataLayout(const Napi::CallbackInfo &info);
22+
void emitToFile(const Napi::CallbackInfo &info);
23+
Napi::Value emitToBuffer(const Napi::CallbackInfo &info);
2224
};

0 commit comments

Comments
 (0)