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;
     }
 
     /**