aboutsummaryrefslogtreecommitdiff
path: root/include/cps
diff options
context:
space:
mode:
author_ov4 <ov4@ov4.org>2026-10-17 10:32:30 +0000
committer_ov4 <ov4@ov4.org>2026-10-17 10:32:30 +0000
commit377a1fd2eadd2a70cd27f13e2fee6e96c8706a51 (patch)
treec05665f26b3434359cf4ae7720e8f9111a322522 /include/cps
parentf5246db6d045ffb86d6717e1b1c37f03bcb2b75b (diff)
feat(codegen): overload global functions and procedures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'include/cps')
-rw-r--r--include/cps/ArrayHandler.h2
-rw-r--r--include/cps/CodeGen.h6
-rw-r--r--include/cps/FunctionGen.h15
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);