Mercurial > projects > dang
changeset 86:29f486ccc203 new_gen
Fixed a bug that made arrays as params fail big time
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Fri, 02 May 2008 21:21:18 +0200 |
parents | 9375bd975730 |
children | 9a35a973175a |
files | ast/Decl.d ast/Exp.d gen/CodeGen.d sema/AstAction.d sema/SymbolTableBuilder.d |
diffstat | 5 files changed, 21 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/ast/Decl.d Fri May 02 20:18:50 2008 +0200 +++ b/ast/Decl.d Fri May 02 21:21:18 2008 +0200 @@ -52,10 +52,7 @@ override DType type() { - if(identifier) - return env.find(identifier).type; - else - return env.findType(varType); + return env.find(identifier).type; } Identifier varType, identifier;
--- a/ast/Exp.d Fri May 02 20:18:50 2008 +0200 +++ b/ast/Exp.d Fri May 02 21:21:18 2008 +0200 @@ -69,7 +69,7 @@ Exp simplify() { - if(auto t = cast(DStruct)type) + if(auto t = type.asStruct) { DFunction func_t = cast(DFunction)exp.type(); assert(func_t !is null, "Calling on something that isn't a function");
--- a/gen/CodeGen.d Fri May 02 20:18:50 2008 +0200 +++ b/gen/CodeGen.d Fri May 02 21:21:18 2008 +0200 @@ -83,12 +83,17 @@ Type[] param_types; foreach (i, p; fd.funcArgs) { - DType t = p.env.findType(p.varType); - if(auto st = cast(DStruct)t) + DType t = p.env.find(p.identifier).type; + if(auto st = t.asStruct) { Type pointer = PointerType.Get(llvm(st)); param_types ~= pointer; } + if(auto ar = t.asArray) + { + Type pointer = PointerType.Get(llvm(ar)); + param_types ~= pointer; + } else param_types ~= llvm(t); } @@ -105,13 +110,17 @@ if(i == 0 && fd.sret) llfunc.addParamAttr(0, ParamAttr.StructRet); - DType t = p.env.findType(p.varType); - if(auto st = cast(DStruct)t) + DType t = p.env.find(p.identifier).type; + if(auto st = t.asStruct) { if(i == 0 && fd.sret) continue; llfunc.addParamAttr(i,ParamAttr.ByVal); } + else if(auto ar = t.asArray) + { + llfunc.addParamAttr(i,ParamAttr.ByVal); + } } }; auto visitor = new VisitFuncDecls(registerFunc); @@ -152,6 +161,7 @@ auto func_t = cast(FunctionType)func_tp.elementType(); auto ret_t = func_t.returnType(); + auto bb = llfunc.appendBasicBlock("entry"); b.positionAtEnd(bb); @@ -316,7 +326,7 @@ case ExpType.Identifier: auto identifier = cast(Identifier)exp; auto sym = exp.env.find(identifier); - if(sym.type.isStruct) + if(sym.type.isStruct || sym.type.isArray) return table.find(sym.id.get); else return b.buildLoad(table.find(sym.id.get), sym.id.get); @@ -675,6 +685,8 @@ foreach(param; f.params) if (param.isStruct) params ~= PointerType.Get(llvm(param)); + else if (param.isArray) + params ~= PointerType.Get(llvm(param)); else params ~= llvm(param);
--- a/sema/AstAction.d Fri May 02 20:18:50 2008 +0200 +++ b/sema/AstAction.d Fri May 02 21:21:18 2008 +0200 @@ -64,7 +64,7 @@ { FuncDecl fd = cast(FuncDecl)func; if(name) - fd.addParam(new Identifier(type.tok), new Identifier(name.tok)); + fd.addParam(handleType(type), new Identifier(name.tok)); else fd.addParam(new Identifier(type.tok)); }
--- a/sema/SymbolTableBuilder.d Fri May 02 20:18:50 2008 +0200 +++ b/sema/SymbolTableBuilder.d Fri May 02 21:21:18 2008 +0200 @@ -35,14 +35,12 @@ override void visitVarDecl(VarDecl d) { visitExp(d.varType); - if(!d.identifier) - return; + visitExp(d.identifier); if (d.init) visitExp(d.init); d.env.find(d.identifier).type = typeOf(d.varType, d.env); - visitExp(d.identifier); } override void visitStructDecl(StructDecl s) @@ -138,8 +136,6 @@ --need_push; } - if(!d.identifier) - return; auto sc = current(); auto sym = sc.add(d.identifier); d.env = sc;