summaryrefslogtreecommitdiff
path: root/node/LiteralNode.cc
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-05-14 02:05:13 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-05-14 02:05:13 +0800
commitd80958f987790f533f5048c2e0e8a1cd5fd9f5a1 (patch)
tree48f1fcc577eb9b92b2766a0d354f59f12cf8680f /node/LiteralNode.cc
parentc7d52437db42232d98e585a52ed2fdf75eb7f1af (diff)
use template to make literal nodes
Diffstat (limited to 'node/LiteralNode.cc')
-rw-r--r--node/LiteralNode.cc29
1 files changed, 25 insertions, 4 deletions
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_);