summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/BaseNode.cc2
-rw-r--r--node/LiteralNode.cc29
-rw-r--r--node/LiteralNode.hh20
-rw-r--r--node/Node.hh1
4 files changed, 42 insertions, 10 deletions
diff --git a/node/BaseNode.cc b/node/BaseNode.cc
index 98ebb82..de38f55 100644
--- a/node/BaseNode.cc
+++ b/node/BaseNode.cc
@@ -1,4 +1,4 @@
-#include "BaseNode.hh"
+#include "Node.hh"
namespace pcc {
BaseNode::BaseNode(Driver* driver)
diff --git a/node/LiteralNode.cc b/node/LiteralNode.cc
index dd84ff9..1e9c4b7 100644
--- a/node/LiteralNode.cc
+++ b/node/LiteralNode.cc
@@ -1,11 +1,32 @@
+#include <llvm/ADT/APFloat.h>
+#include <llvm/ADT/APInt.h>
+
+#include "Driver.hh"
#include "Node.hh"
namespace pcc {
-StringLiteralNode::StringLiteralNode(Driver* driver, char* value)
- : BaseNode(driver)
- , value_(value) {}
+template <> Value BooleanLiteralNode::CodeGen() {
+ llvm::LLVMContext& context = driver_->GetModule()->getContext();
+ if (value_ == true) {
+ return llvm::ConstantInt::getTrue(context);
+ } else {
+ return llvm::ConstantInt::getFalse(context);
+ }
+}
+
+template <> Value IntegerLiteralNode::CodeGen() {
+ llvm::LLVMContext& context = driver_->GetModule()->getContext();
+ llvm::APInt value(32, (uint64_t) value_, true);
+ return llvm::ConstantInt::get(context, value);
+}
+
+template <> Value RealLiteralNode::CodeGen() {
+ llvm::LLVMContext& context = driver_->GetModule()->getContext();
+ llvm::APFloat value(value_);
+ return llvm::ConstantFP::get(context, value);
+}
-Value StringLiteralNode::CodeGen() {
+template <> Value StringLiteralNode::CodeGen() {
llvm::Module* module = driver_->GetModule();
llvm::LLVMContext& context = module->getContext();
llvm::Constant* str = llvm::ConstantDataArray::getString(context, value_);
diff --git a/node/LiteralNode.hh b/node/LiteralNode.hh
index 4f9a61a..1d5c1b8 100644
--- a/node/LiteralNode.hh
+++ b/node/LiteralNode.hh
@@ -6,14 +6,26 @@
#include "BaseNode.hh"
namespace pcc {
-class StringLiteralNode : public BaseNode {
+template <typename Type, typename Construct = Type>
+class LiteralNode : public BaseNode {
public:
- StringLiteralNode(Driver* driver, char* value);
- Value CodeGen() override;
+ LiteralNode(Driver* driver, Construct value);
+ Value CodeGen() override; // type-specific CodeGen() is in the .cc file.
private:
- std::string value_;
+ Type value_;
};
+
+template <typename Type, typename Construct>
+LiteralNode<Type, Construct>::LiteralNode(Driver* driver,
+ Construct value)
+ : BaseNode(driver)
+ , value_(value) {}
+
+using BooleanLiteralNode = LiteralNode<bool>;
+using IntegerLiteralNode = LiteralNode<int>;
+using RealLiteralNode = LiteralNode<float>;
+using StringLiteralNode = LiteralNode<std::string, char*>;
} // namespace pcc
#endif
diff --git a/node/Node.hh b/node/Node.hh
index 3a02689..daf99eb 100644
--- a/node/Node.hh
+++ b/node/Node.hh
@@ -1,7 +1,6 @@
#ifndef PCC_NODE_H
#define PCC_NODE_H
-#include "Driver.hh"
#include "BaseNode.hh"
#include "LiteralNode.hh"