summaryrefslogtreecommitdiff
path: root/node/DeclNode.cc
diff options
context:
space:
mode:
Diffstat (limited to 'node/DeclNode.cc')
-rw-r--r--node/DeclNode.cc12
1 files changed, 8 insertions, 4 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});
}