summaryrefslogtreecommitdiff
path: root/node/LiteralNode.cc
blob: 57cc65b44d44505db9a7eb017d4647d9cd2088fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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