diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/cps/CodeGen.h | 16 | ||||
| -rw-r--r-- | include/cps/FileHandler.h | 2 | ||||
| -rw-r--r-- | include/cps/StringConversionHandler.h | 33 | ||||
| -rw-r--r-- | include/cps/StringHandler.h | 42 | ||||
| -rw-r--r-- | include/cps/TypeSystem.h | 5 |
5 files changed, 12 insertions, 86 deletions
diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h index 30f4135..e6281c5 100644 --- a/include/cps/CodeGen.h +++ b/include/cps/CodeGen.h @@ -11,8 +11,6 @@ #include "cps/TypeSystem.h" #include "cps/ArithmeticHandler.h" -#include "cps/StringHandler.h" -#include "cps/StringConversionHandler.h" #include <map> #include <memory> @@ -93,6 +91,12 @@ class CodeGen { bool prepareSymbolDeclaration(const std::string &Name, bool IsConstant = false); bool requireWritable(const SymbolInfo &Info, const std::string &Name); void emitConstantStmt(ConstantStmtAST *Stmt); + std::map<const ConstantStmtAST *, SymbolInfo> StringConstants; + const TypeInfo *requireStringType(); + llvm::Value *emitStringFromCString(llvm::Value *Text); + llvm::Value *emitStringCString(llvm::Value *Value); + llvm::Value *emitCStringExpr(ExprAST *Expr); + bool containsString(const TypeInfo *Type) const; std::unique_ptr<TypeSystem> Types; std::unique_ptr<ArrayHandler> Arrays; @@ -101,14 +105,11 @@ class CodeGen { std::unique_ptr<FunctionGen> FuncGen; std::unique_ptr<ArithmeticHandler> ArithHandler; - std::unique_ptr<StringHandler> StrHandler; - std::unique_ptr<StringConversionHandler> StrConvHandler; std::unique_ptr<FileHandler> Files; std::unique_ptr<MemoryHandler> Memory; llvm::FunctionCallee PrintfFunc; llvm::FunctionCallee ScanfFunc; - llvm::FunctionCallee MallocFunc; llvm::Value *PrintfFormatStr; // %lld\n llvm::Value *PrintfFloatFormatStr; // %f\n @@ -117,7 +118,6 @@ class CodeGen { llvm::Value *ScanfFormatStr; // %lld llvm::Value *ScanfFloatFormatStr; // %lf - llvm::Value *ScanfStringFormatStr; // %s llvm::Value *TrueStr; // "TRUE" llvm::Value *FalseStr; // "FALSE" @@ -157,7 +157,7 @@ class CodeGen { // Resolves a variable / array element / field chain / deref to an address // (emitting index and null-pointer checks along the way). bool emitLValue(ExprAST *E, LValueInfo &Out); - // The rvalue read: load + the STRING null->"" guard. + // Read a value from resolved storage. llvm::Value *loadFromLValue(const LValueInfo &LV); llvm::Value *emitAllocationSize(ExprAST *Expr); llvm::Value *emitCall(const std::string &Callee, @@ -209,7 +209,7 @@ public: llvm::Value *emitExpr(ExprAST *Expr); void emitStmt(StmtAST *Stmt); - // STRING slots zero-init to null; normalize null to "" at load/print sites. + // Normalize a raw C string pointer to "" when explicitly casting it to STRING. llvm::Value *emitStringNullGuard(llvm::Value *StrVal); // Name-level admission gate for Enum/Record/Pointer plus the existing diff --git a/include/cps/FileHandler.h b/include/cps/FileHandler.h index 50593de..20ece16 100644 --- a/include/cps/FileHandler.h +++ b/include/cps/FileHandler.h @@ -29,7 +29,7 @@ class FileHandler { // libc — declared lazily on first file use llvm::FunctionCallee FopenFunc, FcloseFunc, FgetcFunc, UngetcFunc, FputsFunc, FputcFunc, MallocFunc, ReallocFunc, - StrcmpFunc; + StrcmpFunc, StrlenFunc, MemcpyFunc, FreeFunc; // open-file table llvm::GlobalVariable *FileNames = nullptr; // [TableSize x ptr] STRING passed to OPENFILE diff --git a/include/cps/StringConversionHandler.h b/include/cps/StringConversionHandler.h deleted file mode 100644 index c4879aa..0000000 --- a/include/cps/StringConversionHandler.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/LLVMContext.h" -#include "llvm/IR/Module.h" - -namespace cps { - -class StringConversionHandler { - llvm::LLVMContext &Context; - llvm::IRBuilder<> &Builder; - llvm::Module &Module; - - llvm::FunctionCallee SnprintfFunc; - llvm::FunctionCallee StrtollFunc; - llvm::FunctionCallee StrtodFunc; - llvm::FunctionCallee MallocFunc; - -public: - StringConversionHandler(llvm::LLVMContext &Ctx, llvm::IRBuilder<> &B, llvm::Module &M); - - void setupExternalFunctions(); - - // NUM TO STR(x) RETURNS STRING - llvm::Value *emitNumToStr(llvm::Value *Num, bool IsReal); - - // STR TO NUM(x) RETURNS NUMBER - llvm::Value *emitStrToNum(llvm::Value *Str, bool AsReal); - - // IS NUM(ThisString) RETURNS BOOLEAN - llvm::Value *emitIsNum(llvm::Value *Str); -}; - -} // namespace cps diff --git a/include/cps/StringHandler.h b/include/cps/StringHandler.h deleted file mode 100644 index 0b2447c..0000000 --- a/include/cps/StringHandler.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/LLVMContext.h" -#include "llvm/IR/Module.h" -#include <string> - -namespace cps { - -class StringHandler { - llvm::LLVMContext &Context; - llvm::IRBuilder<> &Builder; - llvm::Module &Module; - - llvm::FunctionCallee MallocFunc; - llvm::FunctionCallee StrLenFunc; - llvm::FunctionCallee MemCpyFunc; - llvm::FunctionCallee StrCpyFunc; - llvm::FunctionCallee StrCatFunc; - llvm::FunctionCallee StrCmpFunc; - llvm::FunctionCallee ToUpperFunc; - llvm::FunctionCallee ToLowerFunc; - - llvm::Value *emitCaseConvert(llvm::Value *Str, llvm::FunctionCallee CaseFn); - llvm::Value *allocCopySubstring(llvm::Value *Src, llvm::Value *StartIdx, llvm::Value *Len); - -public: - StringHandler(llvm::LLVMContext &Ctx, llvm::IRBuilder<> &B, llvm::Module &M); - - void setupExternalFunctions(); - llvm::Value *createLiteral(const std::string &Val); - - llvm::Value *emitLength(llvm::Value *Str); - llvm::Value *emitConcat(llvm::Value *LHS, llvm::Value *RHS); - llvm::Value *emitCompare(int Op, llvm::Value *LHS, llvm::Value *RHS); - 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); -}; - -} diff --git a/include/cps/TypeSystem.h b/include/cps/TypeSystem.h index 1391345..e4663eb 100644 --- a/include/cps/TypeSystem.h +++ b/include/cps/TypeSystem.h @@ -26,7 +26,6 @@ enum class TypeKind { Integer, Real, Boolean, - String, Char, Void, Enum, @@ -109,10 +108,12 @@ struct SymbolInfo { llvm::Value *Storage = nullptr; std::string TypeName; bool IsArray = false; - llvm::Constant *ConstantValue = nullptr; // Non-null for CONSTANT; no storage. + llvm::Constant *ConstantValue = nullptr; // Compile-time scalar CONSTANT value, if available. unsigned ScopeID = 0; bool IsReference = false; // Storage is a slot containing the current object address. bool IsGlobal = false; + bool ReadOnly = false; // Owned STRING constants use storage instead of ConstantValue. + bool isConstant() const { return ConstantValue || ReadOnly; } }; class TypeSystem { |
