diff options
Diffstat (limited to 'node/LiteralNode.cc')
| -rw-r--r-- | node/LiteralNode.cc | 29 |
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_); |
