#pragma once #include "llvm/IR/IRBuilder.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include #include namespace cps { class StringHandler { llvm::LLVMContext &Context; llvm::IRBuilder<> &Builder; llvm::Module &Module; std::map &NamedValues; llvm::FunctionCallee MallocFunc; llvm::FunctionCallee FreeFunc; llvm::FunctionCallee StrLenFunc; llvm::FunctionCallee MemCpyFunc; llvm::FunctionCallee ToUpperFunc; llvm::FunctionCallee ToLowerFunc; public: StringHandler(llvm::LLVMContext &Ctx, llvm::IRBuilder<> &B, llvm::Module &M, std::map &NV); void setupExternalFunctions(); void emitDeclare(const std::string &Name); llvm::Value *createLiteral(const std::string &Val); llvm::Value *emitLength(llvm::Value *Str); llvm::Value *emitMid(llvm::Value *Str, llvm::Value *Start, llvm::Value *Len); llvm::Value *emitRight(llvm::Value *Str, llvm::Value *Len); llvm::Value *emitLeft(llvm::Value *Str, llvm::Value *Len); llvm::Value *emitLCase(llvm::Value *Str); llvm::Value *emitUCase(llvm::Value *Str); }; }