summaryrefslogtreecommitdiff
path: root/node/LiteralNode.cc
diff options
context:
space:
mode:
Diffstat (limited to 'node/LiteralNode.cc')
-rw-r--r--node/LiteralNode.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/node/LiteralNode.cc b/node/LiteralNode.cc
new file mode 100644
index 0000000..57cc65b
--- /dev/null
+++ b/node/LiteralNode.cc
@@ -0,0 +1,22 @@
+#include "LiteralNode.hh"
+
+namespace pcc {
+StringLiteralNode::StringLiteralNode(Driver* driver, char* value)
+ : BaseNode(driver)
+ , value_(value) {}
+
+Value StringLiteralNode::CodeGen() {
+ llvm::Module* module = driver_->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;
+}
+} // namespace pcc