diff options
Diffstat (limited to 'node')
| -rw-r--r-- | node/BaseNode.cc | 6 | ||||
| -rw-r--r-- | node/BaseNode.hh | 21 | ||||
| -rw-r--r-- | node/LiteralNode.cc | 22 | ||||
| -rw-r--r-- | node/LiteralNode.hh | 17 |
4 files changed, 66 insertions, 0 deletions
diff --git a/node/BaseNode.cc b/node/BaseNode.cc new file mode 100644 index 0000000..98ebb82 --- /dev/null +++ b/node/BaseNode.cc @@ -0,0 +1,6 @@ +#include "BaseNode.hh" + +namespace pcc { +BaseNode::BaseNode(Driver* driver) + : driver_(driver) {} +} // namespace pcc diff --git a/node/BaseNode.hh b/node/BaseNode.hh new file mode 100644 index 0000000..ae0ccea --- /dev/null +++ b/node/BaseNode.hh @@ -0,0 +1,21 @@ +#ifndef PCC_BASE_H +#define PCC_BASE_H + +#include <llvm/IR/Value.h> + +#include "Driver.hh" + +namespace pcc { +using Value = llvm::Value*; + +class BaseNode { + public: + virtual Value CodeGen() = 0; + BaseNode(Driver* driver); + + protected: + Driver* driver_; +}; +} // namespace pcc + +#endif 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 diff --git a/node/LiteralNode.hh b/node/LiteralNode.hh new file mode 100644 index 0000000..2e9b43a --- /dev/null +++ b/node/LiteralNode.hh @@ -0,0 +1,17 @@ +#ifndef PCC_LITERALNODE_H +#define PCC_LITERALNODE_H + +#include "BaseNode.hh" + +namespace pcc { +class StringLiteralNode : public BaseNode { + public: + StringLiteralNode(Driver* driver, char* value); + Value CodeGen() override; + + private: + char* value_; +}; +} // namespace pcc + +#endif |
