[llvm-commits] CVS: llvm/tools/llvm-upgrade/UpgradeLexer.l UpgradeParser.y ParserInternals.h UpgradeParser.h

Reid Spencer reid at x10sys.com
Sat Dec 2 12:20:11 PST 2006



Changes in directory llvm/tools/llvm-upgrade:

UpgradeLexer.l updated: 1.7 -> 1.8
UpgradeParser.y updated: 1.13 -> 1.14
ParserInternals.h updated: 1.6 -> 1.7
UpgradeParser.h updated: 1.9 -> 1.10
---
Log message:

Support several new upgrades:
  div -> fdiv/udiv/sdiv
  rem -> frem/urem/srem
  except -> unwind
  uninitialized -> external
as well as tracking the element type of pointers, packed, and array.


---
Diffs of the changes:  (+215 -169)

 ParserInternals.h |    3 
 UpgradeLexer.l    |    8 -
 UpgradeParser.h   |  280 +++++++++++++++++++++++++++---------------------------
 UpgradeParser.y   |   93 ++++++++++++-----
 4 files changed, 215 insertions(+), 169 deletions(-)


Index: llvm/tools/llvm-upgrade/UpgradeLexer.l
diff -u llvm/tools/llvm-upgrade/UpgradeLexer.l:1.7 llvm/tools/llvm-upgrade/UpgradeLexer.l:1.8
--- llvm/tools/llvm-upgrade/UpgradeLexer.l:1.7	Fri Dec  1 22:11:07 2006
+++ llvm/tools/llvm-upgrade/UpgradeLexer.l	Sat Dec  2 14:19:56 2006
@@ -50,6 +50,7 @@
 #define RET_TY(sym,OldTY,NewTY,sign) \
   Upgradelval.Type.newTy = new std::string(NewTY); \
   Upgradelval.Type.oldTy = OldTY; \
+  Upgradelval.Type.elemTy = VoidTy; \
   return sym
 
 #define YY_NEVER_INTERACTIVE 1
@@ -114,6 +115,7 @@
 dllexport       { RET_TOK( DLLEXPORT); }
 extern_weak     { RET_TOK( EXTERN_WEAK); }
 external        { RET_TOK( EXTERNAL); }
+uninitialized   { RET_TOK( UNINITIALIZED); }  // alias for external
 implementation  { RET_TOK( IMPLEMENTATION); }
 zeroinitializer { RET_TOK( ZEROINITIALIZER); }
 \.\.\.          { RET_TOK( DOTDOTDOT); }
@@ -163,11 +165,11 @@
 add             { RET_TOK( ADD); }
 sub             { RET_TOK( SUB); }
 mul             { RET_TOK( MUL); }
-div             { RET_TOK( UDIV); }
+div             { RET_TOK( DIV); }
 udiv            { RET_TOK( UDIV); }
 sdiv            { RET_TOK( SDIV); }
 fdiv            { RET_TOK( FDIV); }
-rem             { RET_TOK( UREM); }
+rem             { RET_TOK( REM);  }
 urem            { RET_TOK( UREM); }
 srem            { RET_TOK( SREM); }
 frem            { RET_TOK( FREM); }
@@ -207,7 +209,7 @@
 switch          { RET_TOK( SWITCH); }
 invoke          { RET_TOK( INVOKE); }
 unwind          { RET_TOK( UNWIND); }
-except          { RET_TOK( UNWIND); }
+except          { RET_TOK( EXCEPT); } // alias for unwind
 unreachable     { RET_TOK( UNREACHABLE); }
 
 malloc          { RET_TOK( MALLOC); }


Index: llvm/tools/llvm-upgrade/UpgradeParser.y
diff -u llvm/tools/llvm-upgrade/UpgradeParser.y:1.13 llvm/tools/llvm-upgrade/UpgradeParser.y:1.14
--- llvm/tools/llvm-upgrade/UpgradeParser.y:1.13	Sat Dec  2 10:19:28 2006
+++ llvm/tools/llvm-upgrade/UpgradeParser.y	Sat Dec  2 14:19:56 2006
@@ -65,9 +65,10 @@
 static void ResolveType(TypeInfo& Ty) {
   if (Ty.oldTy == UnresolvedTy) {
     TypeMap::iterator I = NamedTypes.find(*Ty.newTy);
-    if (I != NamedTypes.end())
+    if (I != NamedTypes.end()) {
       Ty.oldTy = I->second.oldTy;
-    else {
+      Ty.elemTy = I->second.elemTy;
+    } else {
       std::string msg("Can't resolve type: ");
       msg += *Ty.newTy;
       yyerror(msg.c_str());
@@ -76,6 +77,7 @@
     unsigned ref = atoi(&((Ty.newTy->c_str())[1])); // Skip the '\\'
     if (ref < EnumeratedTypes.size()) {
       Ty.oldTy = EnumeratedTypes[ref].oldTy;
+      Ty.elemTy = EnumeratedTypes[ref].elemTy;
     } else {
       std::string msg("Can't resolve type: ");
       msg += *Ty.newTy;
@@ -204,6 +206,32 @@
   return Result;
 }
 
+const char* getDivRemOpcode(const std::string& opcode, const TypeInfo& TI) {
+  const char* op = opcode.c_str();
+  TypeInfo Ty = TI;
+  ResolveType(Ty);
+  if (Ty.isPacked())
+    Ty.oldTy = Ty.getElementType();
+  if (opcode == "div")
+    if (Ty.isFloatingPoint())
+      op = "fdiv";
+    else if (Ty.isUnsigned())
+      op = "udiv";
+    else if (Ty.isSigned())
+      op = "sdiv";
+    else
+      yyerror("Invalid type for div instruction");
+  else if (opcode == "rem")
+    if (Ty.isFloatingPoint())
+      op = "frem";
+    else if (Ty.isUnsigned())
+      op = "urem";
+    else if (Ty.isSigned())
+      op = "srem";
+    else
+      yyerror("Invalid type for rem instruction");
+  return op;
+}
 %}
 
 %file-prefix="UpgradeParser"
@@ -226,13 +254,13 @@
 %token <String> TO DOTDOTDOT CONST INTERNAL LINKONCE WEAK 
 %token <String> DLLIMPORT DLLEXPORT EXTERN_WEAK APPENDING
 %token <String> NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG
-%token <String> ALIGN
+%token <String> ALIGN UNINITIALIZED
 %token <String> DEPLIBS CALL TAIL ASM_TOK MODULE SIDEEFFECT
 %token <String> CC_TOK CCC_TOK CSRETCC_TOK FASTCC_TOK COLDCC_TOK
 %token <String> X86_STDCALLCC_TOK X86_FASTCALLCC_TOK
 %token <String> DATALAYOUT
-%token <String> RET BR SWITCH INVOKE UNWIND UNREACHABLE
-%token <String> ADD SUB MUL UDIV SDIV FDIV UREM SREM FREM AND OR XOR
+%token <String> RET BR SWITCH INVOKE EXCEPT UNWIND UNREACHABLE
+%token <String> ADD SUB MUL DIV UDIV SDIV FDIV REM UREM SREM FREM AND OR XOR
 %token <String> SETLE SETGE SETLT SETGT SETEQ SETNE  // Binary Comparators
 %token <String> MALLOC ALLOCA FREE LOAD STORE GETELEMENTPTR
 %token <String> PHI_TOK SELECT SHL SHR ASHR LSHR VAARG
@@ -247,10 +275,10 @@
 %type <String> ArgVal ArgListH ArgList FunctionHeaderH BEGIN FunctionHeader END
 %type <String> Function FunctionProto BasicBlock TypeListI
 %type <String> InstructionList BBTerminatorInst JumpTable Inst PHIList
-%type <String> OptTailCall InstVal OptVolatile
+%type <String> OptTailCall InstVal OptVolatile Unwind
 %type <String> MemoryInst SymbolicValueRef OptSideEffect GlobalType
 %type <String> FnDeclareLinkage BasicBlockList BigOrLittle AsmBlock
-%type <String> Name ConstValueRef ConstVector
+%type <String> Name ConstValueRef ConstVector External
 %type <String> ShiftOps SetCondOps LogicalOps ArithmeticOps CastOps 
 
 %type <ValList> ValueRefList ValueRefListE IndexList
@@ -273,7 +301,8 @@
 
 // Operations that are notably excluded from this list include:
 // RET, BR, & SWITCH because they end basic blocks and are treated specially.
-ArithmeticOps: ADD | SUB | MUL | UDIV | SDIV | FDIV | UREM | SREM | FREM;
+ArithmeticOps: ADD | SUB | MUL | DIV | UDIV | SDIV | FDIV 
+             | REM | UREM | SREM | FREM;
 LogicalOps   : AND | OR | XOR;
 SetCondOps   : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE;
 ShiftOps     : SHL | SHR | ASHR | LSHR;
@@ -378,12 +407,10 @@
     $$.newTy = $1;
     $$.oldTy = UnresolvedTy;
   }
-  | PrimType 
-  ;
-
-// Include derived types in the Types production.
-//
-UpRTypes : '\\' EUINT64VAL {                   // Type UpReference
+  | PrimType { 
+    $$ = $1; 
+  }
+  | '\\' EUINT64VAL {                   // Type UpReference
     $2->insert(0, "\\");
     $$.newTy = $2;
     $$.oldTy = NumericTy;
@@ -400,6 +427,7 @@
     delete $4.newTy;
     $$.newTy = $2;
     $$.oldTy = ArrayTy;
+    $$.elemTy = $4.oldTy;
   }
   | '<' EUINT64VAL 'x' UpRTypes '>' {          // Packed array type?
     $2->insert(0,"< ");
@@ -407,6 +435,7 @@
     delete $4.newTy;
     $$.newTy = $2;
     $$.oldTy = PackedTy;
+    $$.elemTy = $4.oldTy;
   }
   | '{' TypeListI '}' {                        // Structure type?
     $2->insert(0, "{ ");
@@ -420,6 +449,7 @@
   }
   | UpRTypes '*' {                             // Pointer type?
     *$1.newTy += '*';
+    $$.elemTy = $1.oldTy;
     $1.oldTy = PointerTy;
     $$ = $1;
   };
@@ -586,9 +616,10 @@
     $$ = $1;
   }
   | ArithmeticOps '(' ConstVal ',' ConstVal ')' {
-    *$1 += "(" + *$3.cnst + "," + *$5.cnst + ")";
-    $3.destroy(); $5.destroy();
-    $$ = $1;
+    const char* op = getDivRemOpcode(*$1, $3.type); 
+    $$ = new std::string(op);
+    *$$ += "(" + *$3.cnst + "," + *$5.cnst + ")";
+    delete $1; $3.destroy(); $5.destroy();
   }
   | LogicalOps '(' ConstVal ',' ConstVal ')' {
     *$1 += "(" + *$3.cnst + "," + *$5.cnst + ")";
@@ -671,12 +702,15 @@
   }
   | ConstPool { $$ = 0; }
 
+External : EXTERNAL | UNINITIALIZED { $$ = $1; *$$ = "external"; }
+
 // ConstPool - Constants with optional names assigned to them.
 ConstPool : ConstPool OptAssign TYPE TypesV {
     EnumeratedTypes.push_back($4);
     if (!$2->empty()) {
       NamedTypes[*$2].newTy = new std::string(*$4.newTy);
       NamedTypes[*$2].oldTy = $4.oldTy;
+      NamedTypes[*$2].elemTy = $4.elemTy;
       *O << *$2 << " = ";
     }
     *O << "type " << *$4.newTy << "\n";
@@ -700,7 +734,7 @@
     delete $2; delete $3; delete $4; $5.destroy(); delete $6; 
     $$ = 0;
   }
-  | ConstPool OptAssign EXTERNAL GlobalType Types  GlobalVarAttributes {
+  | ConstPool OptAssign External GlobalType Types  GlobalVarAttributes {
     if (!$2->empty())
       *O << *$2 << " = ";
     *O <<  *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n";
@@ -837,12 +871,8 @@
     $$ = $1;
   };
 
-BEGIN : BEGINTOK {
-    $$ = new std::string("begin");
-  }
-  | '{' { 
-    $$ = new std::string ("{");
-  }
+BEGIN : BEGINTOK { $$ = new std::string("{"); delete $1; }
+  | '{' { $$ = new std::string ("{"); }
 
 FunctionHeader : OptLinkage FunctionHeaderH BEGIN {
   if (!$1->empty()) {
@@ -853,7 +883,7 @@
   $$ = 0;
 };
 
-END : ENDTOK { $$ = new std::string("end"); }
+END : ENDTOK { $$ = new std::string("}"); delete $1; }
     | '}' { $$ = new std::string("}"); };
 
 Function : FunctionHeader BasicBlockList END {
@@ -960,6 +990,8 @@
     $$ = 0;
   };
 
+Unwind : UNWIND | EXCEPT { $$ = $1; *$$ = "unwind"; }
+
 BBTerminatorInst : RET ResolvedVal {              // Return with a result...
     *O << "    " << *$1 << " " << *$2.val << "\n";
     delete $1; $2.destroy();
@@ -997,7 +1029,7 @@
     $$ = 0;
   }
   | OptAssign INVOKE OptCallingConv TypesV ValueRef '(' ValueRefListE ')'
-    TO LABEL ValueRef UNWIND LABEL ValueRef {
+    TO LABEL ValueRef Unwind LABEL ValueRef {
     *O << "    ";
     if (!$1->empty())
       *O << *$1 << " = ";
@@ -1016,7 +1048,7 @@
     $14.destroy(); 
     $$ = 0;
   }
-  | UNWIND {
+  | Unwind {
     *O << "    " << *$1 << "\n";
     delete $1;
     $$ = 0;
@@ -1089,9 +1121,10 @@
   ;
 
 InstVal : ArithmeticOps Types ValueRef ',' ValueRef {
-    *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val;
-    $2.destroy(); $3.destroy(); $5.destroy();
-    $$ = $1;
+    const char* op = getDivRemOpcode(*$1, $2); 
+    $$ = new std::string(op);
+    *$$ += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val;
+    delete $1; $2.destroy(); $3.destroy(); $5.destroy();
   }
   | LogicalOps Types ValueRef ',' ValueRef {
     *$1 += " " + *$2.newTy + " " + *$3.val + ", " + *$5.val;


Index: llvm/tools/llvm-upgrade/ParserInternals.h
diff -u llvm/tools/llvm-upgrade/ParserInternals.h:1.6 llvm/tools/llvm-upgrade/ParserInternals.h:1.7
--- llvm/tools/llvm-upgrade/ParserInternals.h:1.6	Sat Dec  2 10:19:28 2006
+++ llvm/tools/llvm-upgrade/ParserInternals.h	Sat Dec  2 14:19:56 2006
@@ -56,9 +56,12 @@
 struct TypeInfo {
   std::string* newTy;
   Types oldTy;
+  Types elemTy;
 
   void destroy() const { delete newTy; }
 
+  Types getElementType() const { return elemTy; }
+
   bool isSigned() const {
     return oldTy == SByteTy || oldTy == ShortTy || 
            oldTy == IntTy || oldTy == LongTy;


Index: llvm/tools/llvm-upgrade/UpgradeParser.h
diff -u llvm/tools/llvm-upgrade/UpgradeParser.h:1.9 llvm/tools/llvm-upgrade/UpgradeParser.h:1.10
--- llvm/tools/llvm-upgrade/UpgradeParser.h:1.9	Sat Dec  2 10:19:28 2006
+++ llvm/tools/llvm-upgrade/UpgradeParser.h	Sat Dec  2 14:19:56 2006
@@ -84,73 +84,77 @@
      LITTLE = 310,
      BIG = 311,
      ALIGN = 312,
-     DEPLIBS = 313,
-     CALL = 314,
-     TAIL = 315,
-     ASM_TOK = 316,
-     MODULE = 317,
-     SIDEEFFECT = 318,
-     CC_TOK = 319,
-     CCC_TOK = 320,
-     CSRETCC_TOK = 321,
-     FASTCC_TOK = 322,
-     COLDCC_TOK = 323,
-     X86_STDCALLCC_TOK = 324,
-     X86_FASTCALLCC_TOK = 325,
-     DATALAYOUT = 326,
-     RET = 327,
-     BR = 328,
-     SWITCH = 329,
-     INVOKE = 330,
-     UNWIND = 331,
-     UNREACHABLE = 332,
-     ADD = 333,
-     SUB = 334,
-     MUL = 335,
-     UDIV = 336,
-     SDIV = 337,
-     FDIV = 338,
-     UREM = 339,
-     SREM = 340,
-     FREM = 341,
-     AND = 342,
-     OR = 343,
-     XOR = 344,
-     SETLE = 345,
-     SETGE = 346,
-     SETLT = 347,
-     SETGT = 348,
-     SETEQ = 349,
-     SETNE = 350,
-     MALLOC = 351,
-     ALLOCA = 352,
-     FREE = 353,
-     LOAD = 354,
-     STORE = 355,
-     GETELEMENTPTR = 356,
-     PHI_TOK = 357,
-     SELECT = 358,
-     SHL = 359,
-     SHR = 360,
-     ASHR = 361,
-     LSHR = 362,
-     VAARG = 363,
-     EXTRACTELEMENT = 364,
-     INSERTELEMENT = 365,
-     SHUFFLEVECTOR = 366,
-     CAST = 367,
-     TRUNC = 368,
-     ZEXT = 369,
-     SEXT = 370,
-     FPTRUNC = 371,
-     FPEXT = 372,
-     FPTOUI = 373,
-     FPTOSI = 374,
-     UITOFP = 375,
-     SITOFP = 376,
-     PTRTOINT = 377,
-     INTTOPTR = 378,
-     BITCAST = 379
+     UNINITIALIZED = 313,
+     DEPLIBS = 314,
+     CALL = 315,
+     TAIL = 316,
+     ASM_TOK = 317,
+     MODULE = 318,
+     SIDEEFFECT = 319,
+     CC_TOK = 320,
+     CCC_TOK = 321,
+     CSRETCC_TOK = 322,
+     FASTCC_TOK = 323,
+     COLDCC_TOK = 324,
+     X86_STDCALLCC_TOK = 325,
+     X86_FASTCALLCC_TOK = 326,
+     DATALAYOUT = 327,
+     RET = 328,
+     BR = 329,
+     SWITCH = 330,
+     INVOKE = 331,
+     EXCEPT = 332,
+     UNWIND = 333,
+     UNREACHABLE = 334,
+     ADD = 335,
+     SUB = 336,
+     MUL = 337,
+     DIV = 338,
+     UDIV = 339,
+     SDIV = 340,
+     FDIV = 341,
+     REM = 342,
+     UREM = 343,
+     SREM = 344,
+     FREM = 345,
+     AND = 346,
+     OR = 347,
+     XOR = 348,
+     SETLE = 349,
+     SETGE = 350,
+     SETLT = 351,
+     SETGT = 352,
+     SETEQ = 353,
+     SETNE = 354,
+     MALLOC = 355,
+     ALLOCA = 356,
+     FREE = 357,
+     LOAD = 358,
+     STORE = 359,
+     GETELEMENTPTR = 360,
+     PHI_TOK = 361,
+     SELECT = 362,
+     SHL = 363,
+     SHR = 364,
+     ASHR = 365,
+     LSHR = 366,
+     VAARG = 367,
+     EXTRACTELEMENT = 368,
+     INSERTELEMENT = 369,
+     SHUFFLEVECTOR = 370,
+     CAST = 371,
+     TRUNC = 372,
+     ZEXT = 373,
+     SEXT = 374,
+     FPTRUNC = 375,
+     FPEXT = 376,
+     FPTOUI = 377,
+     FPTOSI = 378,
+     UITOFP = 379,
+     SITOFP = 380,
+     PTRTOINT = 381,
+     INTTOPTR = 382,
+     BITCAST = 383
    };
 #endif
 /* Tokens.  */
@@ -209,79 +213,83 @@
 #define LITTLE 310
 #define BIG 311
 #define ALIGN 312
-#define DEPLIBS 313
-#define CALL 314
-#define TAIL 315
-#define ASM_TOK 316
-#define MODULE 317
-#define SIDEEFFECT 318
-#define CC_TOK 319
-#define CCC_TOK 320
-#define CSRETCC_TOK 321
-#define FASTCC_TOK 322
-#define COLDCC_TOK 323
-#define X86_STDCALLCC_TOK 324
-#define X86_FASTCALLCC_TOK 325
-#define DATALAYOUT 326
-#define RET 327
-#define BR 328
-#define SWITCH 329
-#define INVOKE 330
-#define UNWIND 331
-#define UNREACHABLE 332
-#define ADD 333
-#define SUB 334
-#define MUL 335
-#define UDIV 336
-#define SDIV 337
-#define FDIV 338
-#define UREM 339
-#define SREM 340
-#define FREM 341
-#define AND 342
-#define OR 343
-#define XOR 344
-#define SETLE 345
-#define SETGE 346
-#define SETLT 347
-#define SETGT 348
-#define SETEQ 349
-#define SETNE 350
-#define MALLOC 351
-#define ALLOCA 352
-#define FREE 353
-#define LOAD 354
-#define STORE 355
-#define GETELEMENTPTR 356
-#define PHI_TOK 357
-#define SELECT 358
-#define SHL 359
-#define SHR 360
-#define ASHR 361
-#define LSHR 362
-#define VAARG 363
-#define EXTRACTELEMENT 364
-#define INSERTELEMENT 365
-#define SHUFFLEVECTOR 366
-#define CAST 367
-#define TRUNC 368
-#define ZEXT 369
-#define SEXT 370
-#define FPTRUNC 371
-#define FPEXT 372
-#define FPTOUI 373
-#define FPTOSI 374
-#define UITOFP 375
-#define SITOFP 376
-#define PTRTOINT 377
-#define INTTOPTR 378
-#define BITCAST 379
+#define UNINITIALIZED 313
+#define DEPLIBS 314
+#define CALL 315
+#define TAIL 316
+#define ASM_TOK 317
+#define MODULE 318
+#define SIDEEFFECT 319
+#define CC_TOK 320
+#define CCC_TOK 321
+#define CSRETCC_TOK 322
+#define FASTCC_TOK 323
+#define COLDCC_TOK 324
+#define X86_STDCALLCC_TOK 325
+#define X86_FASTCALLCC_TOK 326
+#define DATALAYOUT 327
+#define RET 328
+#define BR 329
+#define SWITCH 330
+#define INVOKE 331
+#define EXCEPT 332
+#define UNWIND 333
+#define UNREACHABLE 334
+#define ADD 335
+#define SUB 336
+#define MUL 337
+#define DIV 338
+#define UDIV 339
+#define SDIV 340
+#define FDIV 341
+#define REM 342
+#define UREM 343
+#define SREM 344
+#define FREM 345
+#define AND 346
+#define OR 347
+#define XOR 348
+#define SETLE 349
+#define SETGE 350
+#define SETLT 351
+#define SETGT 352
+#define SETEQ 353
+#define SETNE 354
+#define MALLOC 355
+#define ALLOCA 356
+#define FREE 357
+#define LOAD 358
+#define STORE 359
+#define GETELEMENTPTR 360
+#define PHI_TOK 361
+#define SELECT 362
+#define SHL 363
+#define SHR 364
+#define ASHR 365
+#define LSHR 366
+#define VAARG 367
+#define EXTRACTELEMENT 368
+#define INSERTELEMENT 369
+#define SHUFFLEVECTOR 370
+#define CAST 371
+#define TRUNC 372
+#define ZEXT 373
+#define SEXT 374
+#define FPTRUNC 375
+#define FPEXT 376
+#define FPTOUI 377
+#define FPTOSI 378
+#define UITOFP 379
+#define SITOFP 380
+#define PTRTOINT 381
+#define INTTOPTR 382
+#define BITCAST 383
 
 
 
 
 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 211 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeParser.y"
+#line 239 "/proj/llvm/llvm-4/tools/llvm-upgrade/UpgradeParser.y"
 typedef union YYSTYPE {
   std::string*    String;
   TypeInfo        Type;
@@ -290,7 +298,7 @@
   ValueList*      ValList;
 } YYSTYPE;
 /* Line 1447 of yacc.c.  */
-#line 294 "UpgradeParser.tab.h"
+#line 302 "UpgradeParser.tab.h"
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1






More information about the llvm-commits mailing list