diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/cps/ArrayHandler.h | 2 | ||||
| -rw-r--r-- | include/cps/CodeGen.h | 6 | ||||
| -rw-r--r-- | include/cps/FunctionGen.h | 15 |
3 files changed, 17 insertions, 6 deletions
diff --git a/include/cps/ArrayHandler.h b/include/cps/ArrayHandler.h index 843bdc8..e678af4 100644 --- a/include/cps/ArrayHandler.h +++ b/include/cps/ArrayHandler.h @@ -40,7 +40,6 @@ class ArrayHandler { llvm::Value *computeFlatIndex(const std::string &Name, const std::vector<llvm::Value*> &Indices); llvm::Value *getArrayBasePointer(const std::string &Name); llvm::Value *getElementPointer(const std::string &Name, llvm::Value *Offset); - const ArrayMetadata *getMetadata(const std::string &Name) const; // Shared bounds math: DimSize_i = (Upper_i - Lower_i) + 1, row-major // multipliers back-to-front, TotalElements = product of the sizes. void computeDimsAndMultipliers(const std::string &Name, @@ -68,6 +67,7 @@ public: TypeSystem &TS, RuntimeCheck &RC); + const ArrayMetadata *getMetadata(const std::string &Name) const; void setupExternalFunctions(); void emitArrayDeclare(ArrayDeclareStmtAST *Stmt, CodeGen &CG); diff --git a/include/cps/CodeGen.h b/include/cps/CodeGen.h index d624ca6..463c613 100644 --- a/include/cps/CodeGen.h +++ b/include/cps/CodeGen.h @@ -120,7 +120,7 @@ class CodeGen { void registerSymbol(const std::string &Name, llvm::Value *Storage, const std::string &TypeName, bool IsArray = false); const SymbolInfo *getSymbolInfo(const std::string &Name) const; bool isWholeArrayVar(ExprAST *Expr) const; - const TypeInfo *getExprTypeInfo(ExprAST *Expr) const; + const TypeInfo *getExprTypeInfo(ExprAST *Expr); llvm::Value *coerceValueToType(llvm::Value *Val, const TypeInfo *TargetInfo); llvm::Value *convertNumericValue(llvm::Value *Val, const TypeInfo *Source, const TypeInfo *Target); @@ -150,7 +150,9 @@ class CodeGen { llvm::Value *emitAllocationSize(ExprAST *Expr); llvm::Value *emitCall(const std::string &Callee, const std::vector<std::unique_ptr<ExprAST>> &ArgExprs, int Line); - bool marshalCallArgs(const std::string &Callee, + const FuncSig *resolveCall(const std::string &Name, + const std::vector<std::unique_ptr<ExprAST>> &Args); + bool marshalCallArgs(const FuncSig &Signature, const std::vector<std::unique_ptr<ExprAST>> &ArgExprs, int Line, std::vector<llvm::Value*> &Out); diff --git a/include/cps/FunctionGen.h b/include/cps/FunctionGen.h index eb4a839..c168e1c 100644 --- a/include/cps/FunctionGen.h +++ b/include/cps/FunctionGen.h @@ -36,6 +36,10 @@ struct ParamSig { // back from LLVM types. struct FuncSig { std::string Name; + std::string LinkName; + std::string ParamKey; + bool IsOverload = false; + const PrototypeAST *Prototype = nullptr; std::string ReturnTypeName; std::vector<ParamSig> Params; size_t OwnerUnit = 0; @@ -63,7 +67,10 @@ private: int &DiagnosticLine; void reportError(const char *Fmt, ...); - IdentifierMap<FuncSig> Signatures; + IdentifierMap<std::vector<FuncSig>> Signatures; + IdentifierMap<std::pair<std::string, size_t>> LinkIndex; + std::map<const PrototypeAST *, std::string> PrototypeLinks; + std::map<size_t, std::string> UnitPaths; size_t CurrentUnit = 0; std::function<bool(size_t)> Visible; ArrayParamBinder BindArrayParam; @@ -89,9 +96,11 @@ public: RegisterCopy = std::move(Registrar); } - void setCurrentUnit(size_t Unit) { CurrentUnit = Unit; } + void setCurrentUnit(size_t Unit, const std::string &Path) { CurrentUnit = Unit; UnitPaths[Unit] = Path; } void setVisibility(std::function<bool(size_t)> Predicate) { Visible = std::move(Predicate); } - const FuncSig *getSignature(const std::string &Name) const; + std::vector<const FuncSig *> getOverloads(const std::string &Name) const; + bool hasFunction(const std::string &Name) const { return !getOverloads(Name).empty(); } + const FuncSig *getSignatureByLink(const std::string &Name) const; llvm::Function *emitPrototype(PrototypeAST *Proto); |
