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