summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/DeclNode.cc12
-rw-r--r--node/LiteralNode.cc3
-rw-r--r--node/LiteralNode.hh4
3 files changed, 12 insertions, 7 deletions
diff --git a/node/DeclNode.cc b/node/DeclNode.cc
index 932191e..929bc70 100644
--- a/node/DeclNode.cc
+++ b/node/DeclNode.cc
@@ -1,6 +1,7 @@
#include <llvm/IR/IRBuilder.h>
#include "DeclNode.hh"
+#include "Log.hh"
namespace pcc {
DeclNode::DeclNode(Context* context, VariableList* scope)
@@ -31,9 +32,11 @@ Value VarDeclNode::CodeGen() {
// global variable case
VariableList* globals = context_->GetGlobals();
for (auto&& decl : decls_) {
- llvm::Constant* value = new llvm::GlobalVariable(
- *context_->GetModule(), std::get<1>(decl)->GetLLVMType(), false,
- llvm::GlobalVariable::PrivateLinkage, nullptr);
+ std::shared_ptr<Type> type = std::get<1>(decl);
+ llvm::GlobalValue* value = new llvm::GlobalVariable(
+ *context_->GetModule(), type->GetLLVMType(), false,
+ llvm::GlobalVariable::PrivateLinkage, type->GetZeroInitializer());
+ value->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
globals->Add(std::get<0>(decl),
{manager->GetPointerType(std::get<1>(decl)), value});
}
@@ -54,10 +57,11 @@ Value ConstDeclNode::CodeGen() {
std::shared_ptr<ExprNode> ValueNode = std::get<1>(decl);
Value value = ValueNode->CodeGen();
std::shared_ptr<Type> type = ValueNode->GetType();
- llvm::Constant* constant = new llvm::GlobalVariable(
+ llvm::GlobalValue* constant = new llvm::GlobalVariable(
*context_->GetModule(), type->GetLLVMType(), true,
llvm::GlobalValue::PrivateLinkage,
llvm::cast<llvm::Constant>(value));
+ constant->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
scope_->Add(std::get<0>(decl),
{manager->GetPointerType(type), constant});
}
diff --git a/node/LiteralNode.cc b/node/LiteralNode.cc
index c68a219..5523da6 100644
--- a/node/LiteralNode.cc
+++ b/node/LiteralNode.cc
@@ -40,9 +40,10 @@ Value StringLiteralNode::CodeGen() {
std::static_pointer_cast<PointerType>(type_);
llvm::Constant* ConstantString =
llvm::ConstantDataArray::get(GlobalLLVMContext, value_);
- llvm::Constant* GlobalString = new llvm::GlobalVariable(
+ llvm::GlobalValue* GlobalString = new llvm::GlobalVariable(
*context_->GetModule(), ConstantString->getType(), true,
llvm::GlobalValue::PrivateLinkage, ConstantString);
+ GlobalString->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
Value ZeroIndex =
llvm::ConstantInt::get(pointer->GetIndexType()->GetLLVMType(), 0, true);
return builder->CreateInBoundsGEP(GlobalString, {ZeroIndex, ZeroIndex});
diff --git a/node/LiteralNode.hh b/node/LiteralNode.hh
index ca12131..06f2989 100644
--- a/node/LiteralNode.hh
+++ b/node/LiteralNode.hh
@@ -10,7 +10,7 @@ namespace pcc {
template <typename T> class LiteralNode : public ExprNode {
public:
LiteralNode(Context* context, std::shared_ptr<Type> type, T value);
- Value CodeGen() override;
+ virtual Value CodeGen() override;
private:
T value_;
@@ -35,7 +35,7 @@ class StringLiteralNode : public ExprNode {
public:
StringLiteralNode(Context* context, std::shared_ptr<Type> type,
std::vector<char> value);
- Value CodeGen() override;
+ virtual Value CodeGen() override;
private:
std::vector<char> value_;