Mercurial > projects > dang
diff gen/CodeGen.d @ 143:d76cc5cad4fc
Added partial support for switches.
Added support for extern(C) in CodeGen.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Mon, 21 Jul 2008 01:05:20 +0200 |
parents | b61de188cd0d |
children | 2149f4a7b48d |
line wrap: on
line diff
--- a/gen/CodeGen.d Sun Jul 20 23:41:53 2008 +0200 +++ b/gen/CodeGen.d Mon Jul 21 01:05:20 2008 +0200 @@ -12,6 +12,7 @@ ast.Module : DModule = Module; import basic.SmallArray, + basic.Attribute, basic.LiteralParsing; import lexer.Token; @@ -116,7 +117,7 @@ else if(auto f = cast(DFunction)ret_t) ret_t = f.returnType; auto func_t = FunctionType.Get(llvm(ret_t), param_types); - auto llfunc = m.addFunction(func_t, fd.sym.getMangledFQN()); + auto llfunc = m.addFunction(func_t, symbolName(fd)); foreach (i, p; fd.funcArgs) { @@ -173,7 +174,7 @@ return; llvm(funcDecl.type); - auto llfunc = m.getNamedFunction(funcDecl.sym.getMangledFQN()); + auto llfunc = m.getNamedFunction(symbolName(funcDecl)); auto func_tp = cast(PointerType)llfunc.type; auto func_t = cast(FunctionType)func_tp.elementType(); auto ret_t = func_t.returnType(); @@ -327,7 +328,7 @@ foreach (i, arg; callExp.args) args[i] = genExpression(arg).value; llvm(type); - auto f = m.getNamedFunction(sym.getMangledFQN()); + auto f = m.getNamedFunction(symbolName(callExp.exp)); DFunction f_type = type.asFunction(); bool isVoid = f_type.returnType is DType.Void; // BUG: doesn't do implicit type-conversion on args @@ -537,8 +538,8 @@ auto sw = cast(SwitchStmt)stmt; Value cond = genExpression(sw.cond).value; - auto func_name = stmt.env.parentFunction().identifier.get; - Function func = m.getNamedFunction(func_name); + auto fc = stmt.env.parentFunction(); + Function func = m.getNamedFunction(symbolName(fc)); BasicBlock oldBB = b.getInsertBlock(); BasicBlock defBB; @@ -747,7 +748,16 @@ /// Get the mangled name of a function char[] symbolName(FuncDecl f) { - return f.sym.getMangledFQN(); + if (f.att.getExtern == Extern.D) + return f.sym.getMangledFQN(); + return f.sym.getName; + } + + char[] symbolName(Exp f) + { + if (f.getSymbol.decl.att.getExtern == Extern.D) + return f.getSymbol.getMangledFQN(); + return f.getSymbol.getName; } /**