aboutsummaryrefslogtreecommitdiff
path: root/src/parse.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.cff')
-rw-r--r--src/parse.cff19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/parse.cff b/src/parse.cff
index e731d47..5a50e96 100644
--- a/src/parse.cff
+++ b/src/parse.cff
@@ -2481,7 +2481,11 @@ fn parsevardecl(P *Parser, toplevel bool, externp bool, letp bool, yield DeclYie
decl.u.Static.id = id++;
decl.u.#tag = :Static;
}
- yield(putdecl(P, tok.loc, decl), yarg);
+ let decll *Decl #?;
+ yield(decll = putdecl(P, tok.loc, decl), yarg);
+ if !letp and !fwd {
+ llvm_genstatic(decl.externp, decl.name, &decl.u.Static);
+ }
if !lexmatch(P, &tok, ',') {
lexexpects(P, ';', "`,' or `;'");
@@ -2516,8 +2520,8 @@ fn parsefn(P *Parser, loc Loc, toplevel bool, externp bool, name *const u8) *Dec
if !lexmatch(P, #null, '{') {
lexexpects(P, ';', "';' or '{'");
- if toplevel {
- llvm_addfn(decl);
+ if toplevel or externp {
+ llvm_addglobl(decl, #f);
}
return decl;
}
@@ -2544,8 +2548,8 @@ fn parsefn(P *Parser, loc Loc, toplevel bool, externp bool, name *const u8) *Dec
(as(*Arena)P.alloc.a)->destroy();
}
}
- if toplevel {
- llvm_addfn(decl);
+ if toplevel or externp {
+ llvm_addglobl(decl, #f);
}
P.varid = varid;
P.loopid = loopid;
@@ -2855,8 +2859,11 @@ fn parsedecls(P *Parser, loc Loc, yield DeclYielder, yarg *void, toplevel bool)
a.yield(decl, a.yarg);
}
// ir_genstatic(a.P.irctx, decl);
+ if a.toplevel or a.externp {
+ llvm_addglobl(decl, #t);
+ }
}
- parsevardecl(P, toplevel, externp, #{let?} #t, &varyield, &Arg { P, externp, toplevel, yield, yarg });
+ parsevardecl(P, toplevel, externp, #{let?} #f, &varyield, &Arg { P, externp, toplevel, yield, yarg });
return;
case lexmatch(P, &tok, :kw_def);