diff options
Diffstat (limited to 'node')
| -rw-r--r-- | node/BaseNode.cc | 2 | ||||
| -rw-r--r-- | node/LiteralNode.cc | 29 | ||||
| -rw-r--r-- | node/LiteralNode.hh | 20 | ||||
| -rw-r--r-- | node/Node.hh | 1 |
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" |
