summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-05-12 01:52:49 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-05-12 01:52:49 +0800
commitf146dac784325c9403499046f52f70e3596ae345 (patch)
tree4af8b76cbf83892d3cbfdda7a4b17fa8af34b4a0 /node
initial commit
Diffstat (limited to 'node')
-rw-r--r--node/BaseNode.cc6
-rw-r--r--node/BaseNode.hh21
-rw-r--r--node/LiteralNode.cc22
-rw-r--r--node/LiteralNode.hh17
4 files changed, 66 insertions, 0 deletions
diff --git a/node/BaseNode.cc b/node/BaseNode.cc
new file mode 100644
index 0000000..98ebb82
--- /dev/null
+++ b/node/BaseNode.cc
@@ -0,0 +1,6 @@
+#include "BaseNode.hh"
+
+namespace pcc {
+BaseNode::BaseNode(Driver* driver)
+ : driver_(driver) {}
+} // namespace pcc
diff --git a/node/BaseNode.hh b/node/BaseNode.hh
new file mode 100644
index 0000000..ae0ccea
--- /dev/null
+++ b/node/BaseNode.hh
@@ -0,0 +1,21 @@
+#ifndef PCC_BASE_H
+#define PCC_BASE_H
+
+#include <llvm/IR/Value.h>
+
+#include "Driver.hh"
+
+namespace pcc {
+using Value = llvm::Value*;
+
+class BaseNode {
+ public:
+ virtual Value CodeGen() = 0;
+ BaseNode(Driver* driver);
+
+ protected:
+ Driver* driver_;
+};
+} // namespace pcc
+
+#endif
diff --git a/node/LiteralNode.cc b/node/LiteralNode.cc
new file mode 100644
index 0000000..57cc65b
--- /dev/null
+++ b/node/LiteralNode.cc
@@ -0,0 +1,22 @@
+#include "LiteralNode.hh"
+
+namespace pcc {
+StringLiteralNode::StringLiteralNode(Driver* driver, char* value)
+ : BaseNode(driver)
+ , value_(value) {}
+
+Value StringLiteralNode::CodeGen() {
+ llvm::Module* module = driver_->GetModule();
+ llvm::LLVMContext& context = module->getContext();
+ llvm::Constant* str = llvm::ConstantDataArray::getString(context, value_);
+ llvm::Type* type = str->getType();
+ llvm::GlobalVariable* var = new llvm::GlobalVariable(
+ *module, type, true, llvm::GlobalVariable::InternalLinkage, str);
+ llvm::Constant* zero =
+ llvm::Constant::getNullValue(llvm::IntegerType::getInt32Ty(context));
+ llvm::Constant* indices[] = {zero, zero};
+ llvm::Constant* ptr =
+ llvm::ConstantExpr::getGetElementPtr(type, var, indices, true);
+ return ptr;
+}
+} // namespace pcc
diff --git a/node/LiteralNode.hh b/node/LiteralNode.hh
new file mode 100644
index 0000000..2e9b43a
--- /dev/null
+++ b/node/LiteralNode.hh
@@ -0,0 +1,17 @@
+#ifndef PCC_LITERALNODE_H
+#define PCC_LITERALNODE_H
+
+#include "BaseNode.hh"
+
+namespace pcc {
+class StringLiteralNode : public BaseNode {
+ public:
+ StringLiteralNode(Driver* driver, char* value);
+ Value CodeGen() override;
+
+ private:
+ char* value_;
+};
+} // namespace pcc
+
+#endif