aboutsummaryrefslogtreecommitdiff
path: root/include/cps/FunctionGen.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cps/FunctionGen.h')
-rw-r--r--include/cps/FunctionGen.h15
1 files changed, 12 insertions, 3 deletions
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);