summaryrefslogtreecommitdiff
path: root/node/LiteralNode.cc
diff options
context:
space:
mode:
authorNagi5Yeq <wu@x-nagi.com>2020-05-21 13:32:12 +0800
committerNagi5Yeq <wu@x-nagi.com>2020-05-21 13:32:12 +0800
commit3832be8be4b23fb9e93a3f181e4205eadbdbf4de (patch)
tree0b958eb72400458401be619b04a8a6cf77194255 /node/LiteralNode.cc
parent41f6e75e3f26bdcccfcb3910f202452e14653826 (diff)
binary and unary operations
Diffstat (limited to 'node/LiteralNode.cc')
-rw-r--r--node/LiteralNode.cc51
1 files changed, 29 insertions, 22 deletions
diff --git a/node/LiteralNode.cc b/node/LiteralNode.cc
index fedeb36..19a2419 100644
--- a/node/LiteralNode.cc
+++ b/node/LiteralNode.cc
@@ -2,42 +2,49 @@
#include <llvm/ADT/APInt.h>
#include "Driver.hh"
-#include "Node.hh"
+#include "LiteralNode.hh"
namespace pcc {
template <> Value BooleanLiteralNode::CodeGen() {
- llvm::LLVMContext& context = context_->GetModule()->getContext();
if (value_ == true) {
- return llvm::ConstantInt::getTrue(context);
+ return llvm::ConstantInt::getTrue(GlobalLLVMContext);
} else {
- return llvm::ConstantInt::getFalse(context);
+ return llvm::ConstantInt::getFalse(GlobalLLVMContext);
}
}
+template <> Value CharLiteralNode::CodeGen() {
+ return llvm::ConstantInt::get(type_->GetLLVMType(), value_, true);
+}
+
template <> Value IntegerLiteralNode::CodeGen() {
- llvm::LLVMContext& context = context_->GetModule()->getContext();
- llvm::APInt value(32, (uint64_t) value_, true);
- return llvm::ConstantInt::get(context, value);
+ return llvm::ConstantInt::get(type_->GetLLVMType(), value_, true);
}
template <> Value RealLiteralNode::CodeGen() {
- llvm::LLVMContext& context = context_->GetModule()->getContext();
llvm::APFloat value(value_);
- return llvm::ConstantFP::get(context, value);
+ return llvm::ConstantFP::get(GlobalLLVMContext, value);
+}
+
+StringLiteralNode::StringLiteralNode(Context* context,
+ std::shared_ptr<Type> type, char* begin,
+ char* end)
+ : ExprNode(context)
+ , value_(begin, end) {
+ type_ = type;
}
-template <> Value StringLiteralNode::CodeGen() {
- llvm::Module* module = context_->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;
+Value StringLiteralNode::CodeGen() {
+ llvm::IRBuilder<>* builder = context_->GetBuilder();
+ std::shared_ptr<PointerType> pointer =
+ std::static_pointer_cast<PointerType>(type_);
+ llvm::Constant* ConstantString =
+ llvm::ConstantDataArray::get(GlobalLLVMContext, value_);
+ llvm::Constant* GlobalString = new llvm::GlobalVariable(
+ type_->GetLLVMType(), true, llvm::GlobalValue::PrivateLinkage,
+ ConstantString);
+ Value ZeroIndex =
+ llvm::ConstantInt::get(pointer->GetIndexType()->GetLLVMType(), 0, true);
+ return builder->CreateInBoundsGEP(GlobalString, {ZeroIndex, ZeroIndex});
}
} // namespace pcc