compiler/libec: Fixed allowing headers to redefine uint typedef (#60)
[sdk] / compiler / libec / src / output.ec
index 7d3a7b2..23f4e9f 100644 (file)
@@ -87,7 +87,7 @@ public void OutputTypeName(TypeName type, File f)
       Specifier spec;
       for(spec = type.qualifiers->first; spec; spec = spec.next)
       {
-         OutputSpecifier(spec, f);
+         OutputSpecifier(spec, f, false);
          if(spec.next) f.Puts(" ");
       }
    }
@@ -113,7 +113,7 @@ public void OutputExpression(Expression exp, File f)
             Specifier spec;
             for(spec = exp._classExp.specifiers->first; spec; spec = spec.next)
             {
-               OutputSpecifier(spec, f);
+               OutputSpecifier(spec, f, false);
                if(spec.next) f.Puts(" ");
             }
             if(exp._classExp.decl) 
@@ -262,6 +262,11 @@ public void OutputExpression(Expression exp, File f)
          OutputTypeName(exp.typeName, f);
          f.Puts(")");
          break;
+      case typeAlignExp:
+         f.Puts("__alignof__(");
+         OutputTypeName(exp.typeName, f);
+         f.Puts(")");
+         break;
       case extensionInitializerExp:
          f.Puts("__extension__ (");
          if(exp.initializer.typeName)
@@ -641,7 +646,7 @@ static void OutputStatement(Statement stmt, File f)
          AsmField field;
          f.Puts("__asm__ ");
          if(stmt.asmStmt.spec)
-            OutputSpecifier(stmt.asmStmt.spec, f);
+            OutputSpecifier(stmt.asmStmt.spec, f, false);
          f.Puts("(");
          f.Puts(stmt.asmStmt.statements);
 
@@ -699,7 +704,7 @@ static void OutputPointer(Pointer ptr, File f)
       f.Puts(" ");
       for(spec = ptr.qualifiers->first; spec; spec = spec.next)
       {
-         OutputSpecifier(spec, f);
+         OutputSpecifier(spec, f, false);
          if(spec.next) f.Puts(" ");
       }
    }
@@ -731,7 +736,7 @@ static void OutputDeclarator(Declarator decl, File f)
          if(decl.structDecl.attrib)
          {
             f.Puts(" ");
-            f.Puts(decl.structDecl.attrib);
+            OutputAttrib(decl.structDecl.attrib, f);
          }
          break;
       case identifierDeclarator:
@@ -743,14 +748,15 @@ static void OutputDeclarator(Declarator decl, File f)
          f.Puts(")");
          break;
       case extendedDeclarator:
-         f.Puts(decl.extended.extended);
+         if(decl.extended.extended) OutputExtDecl(decl.extended.extended, f);
          f.Puts(" ");
          OutputDeclarator(decl.declarator, f);
          break;
       case extendedDeclaratorEnd:
          OutputDeclarator(decl.declarator, f);
          f.Puts(" ");
-         f.Puts(decl.extended.extended);
+         if(decl.extended.extended)
+            OutputExtDecl(decl.extended.extended, f);
          break;
       case arrayDeclarator:
          if(decl.declarator)
@@ -816,7 +822,47 @@ static void OutputEnumerator(Enumerator enumerator, File f)
    }
 }
 
-static void OutputSpecifier(Specifier spec, File f)
+static void OutputAttribute(Attribute attr, File f)
+{
+   if(attr.attr)
+      f.Puts(attr.attr);
+   if(attr.exp)
+   {
+      f.Puts(" ");
+      OutputExpression(attr.exp, f);
+   }
+}
+
+static void OutputAttrib(Attrib attr, File f)
+{
+   switch(attr.type)
+   {
+      case ATTRIB:      f.Puts("__attribute__(("); break;
+      case __ATTRIB:    f.Puts("__attribute((");  break;
+      case ATTRIB_DEP:  f.Puts("__attribute_deprecated__(("); break;
+   }
+   
+   if(attr.attribs)
+   {
+      Attribute attrib;
+      for(attrib = attr.attribs->first; attrib; attrib = attrib.next)
+      {
+         if(attrib.prev) f.Puts(" ");
+         OutputAttribute(attrib, f);
+      }
+   }
+   f.Puts("))"); 
+}
+
+static void OutputExtDecl(ExtDecl extDecl, File f)
+{
+   if(extDecl.type == extDeclString && extDecl.s)
+      f.Puts(extDecl.s);
+   else if(extDecl.type == extDeclAttrib)
+      OutputAttrib(extDecl.attr, f);
+}
+
+static void OutputSpecifier(Specifier spec, File f, bool typeName)
 {
    switch(spec.type)
    {
@@ -862,12 +908,12 @@ static void OutputSpecifier(Specifier spec, File f)
                f.Puts("int");
                break;
             case UINT:
-               f.Puts("unsigned int");
+               f.Puts(typeName ? "uint" : "unsigned int");
                break;
             case INT64:
                //f.Puts("__int64");
                //f.Puts("int64");
-               f.Puts("long long");
+               f.Puts(typeName ? "int64" : "long long");
                break;
             case VALIST:
                f.Puts("__builtin_va_list");
@@ -902,6 +948,9 @@ static void OutputSpecifier(Specifier spec, File f)
          }
          break;
       case extendedSpecifier:
+         if(spec.extDecl)
+            OutputExtDecl(spec.extDecl, f);
+         break;
       case nameSpecifier:
       //case classSpecifier:
          if(spec.name && !strcmp(spec.name, "class"))
@@ -949,6 +998,11 @@ static void OutputSpecifier(Specifier spec, File f)
       case unionSpecifier:
       {
          f.Puts((spec.type == structSpecifier) ? "struct" : "union");
+         if(spec.extDeclStruct)
+         {
+            f.Puts(" ");
+            OutputExtDecl(spec.extDeclStruct, f);
+         }
          if(spec.id)
          {
             f.Puts(" ");
@@ -964,7 +1018,7 @@ static void OutputSpecifier(Specifier spec, File f)
                //OutputDeclaration(decl, f);
                OutputClassDef(def, f);
             }
-            f.Puts("}");
+            f.Puts("} __attribute__ ((gcc_struct))");
          }
          break;
       }
@@ -975,7 +1029,7 @@ static void OutputSpecifier(Specifier spec, File f)
          break;
       case subClassSpecifier:
          f.Puts("subclass(");
-         OutputSpecifier(spec._class, f);
+         OutputSpecifier(spec._class, f, false);
          f.Puts(")");                  
          break;
       case templateTypeSpecifier:
@@ -1121,9 +1175,12 @@ static void OutputDeclaration(Declaration decl, File f)
 
          if(decl.specifiers)
          {
+            bool inTypeDef = false;
             for(spec = decl.specifiers->first; spec; spec = spec.next)
             {
-               OutputSpecifier(spec, f);
+               if(spec.type == baseSpecifier && spec.specifier == TYPEDEF)
+                  inTypeDef = true;
+               OutputSpecifier(spec, f, inTypeDef && !spec.next);
                if(spec.next) f.Puts(" ");
             }
          }
@@ -1145,7 +1202,7 @@ static void OutputDeclaration(Declaration decl, File f)
          {
             for(spec = decl.specifiers->first; spec; spec = spec.next)
             {
-               OutputSpecifier(spec, f);
+               OutputSpecifier(spec, f, false);
                if(spec.next) f.Puts(" ");
             }
          }
@@ -1163,7 +1220,7 @@ static void OutputDeclaration(Declaration decl, File f)
          if(decl.extStorage)
          {
             f.Puts(" ");
-            OutputSpecifier(decl.extStorage, f);
+            OutputSpecifier(decl.extStorage, f, false);
          }
          break;
       }
@@ -1196,7 +1253,7 @@ static void OutputFunction(FunctionDefinition func, File f)
       Specifier spec;
       for(spec = func.specifiers->first; spec; spec = spec.next)
       {
-         OutputSpecifier(spec, f);
+         OutputSpecifier(spec, f, false);
          if(spec.next) f.Puts(" ");
       }
       f.Puts(" ");
@@ -1300,7 +1357,7 @@ static void OutputMembersInit(MembersInit init, File f)
 static void OutputInstance(Instantiation inst, File f)
 {
    if(inst._class)
-      OutputSpecifier(inst._class, f);
+      OutputSpecifier(inst._class, f, false);
    if(inst.exp)
    {
       f.Puts(" ");
@@ -1341,7 +1398,7 @@ static void OutputClassFunction(ClassFunction func, File f)
       Specifier spec;
       for(spec = func.specifiers->first; spec; spec = spec.next)
       {
-         OutputSpecifier(spec, f);
+         OutputSpecifier(spec, f, false);
          if(spec.next) f.Puts(" ");
       }
       f.Puts(" ");
@@ -1350,7 +1407,7 @@ static void OutputClassFunction(ClassFunction func, File f)
    {
       //if(func.class != (void *)-1)
       if(func.class)
-         OutputSpecifier(func.class, f);
+         OutputSpecifier(func.class, f, false);
       f.Puts("::");
    }*/
    if(func.declarator) OutputDeclarator(func.declarator, f);
@@ -1414,7 +1471,7 @@ static void OutputClassDef(ClassDef def, File f)
 static void OutputClass(ClassDefinition _class, File f)
 {
    f.Puts("class ");
-   OutputSpecifier(_class._class, f);
+   OutputSpecifier(_class._class, f, false);
    if(_class.baseSpecs)
    {
       Specifier spec;
@@ -1422,7 +1479,7 @@ static void OutputClass(ClassDefinition _class, File f)
       f.Puts(" : ");
       for(spec = _class.baseSpecs->first; spec; spec = spec.next)
       {
-         OutputSpecifier(spec, f);
+         OutputSpecifier(spec, f, false);
       }
    }
    if(_class.definitions)
@@ -1445,7 +1502,7 @@ public void OutputTree(OldList ast, File f)
 {
    External external;
 
-   outputLine = 11;
+   outputLine = 28;
 
    for(external = ast.first; external; external = external.next)
    {