<div dir="ltr">Our architecture has a somewhat different memory model with three different address spaces: local, block, global.<br><div><div><br>Some time ago (prior to my involvement in our project) our address space extensions were added to the frontend so that we can write:<br><br>volatile   int v_i;<br>xstglocal  int l_i;<br>xstgblock  int b_i;<br>xstgglobal int g_i;<br><br>volatile   int* p_vi;       // Regular pointer to volatile integer<br>xstglocal  int* p_li;       // Regular pointer to local integer <br>xstgblock  int* b_pi;       // Regular pointer to block integer <br>xstgglobal int* g_pi;       // Regular pointer to global integer<br><br>int* volatile   vp_i;       // Volatile pointer to regular integer<br><br></div><div>These address space modifiers (xstglocal, xstgblock, xstgglobal) are used to determine which address space data is stored in. The above will compile just fine.<br><br></div><div>However, originally this work was done for clang/llvm 3.2. After we moved to 3.6 we found that the following (which used to work in 3.2) no longer works in 3.6:<br><br>int* xstglocal  lp_i;       // Local pointer to any integer<br>int* xstgblock  b_pi;       // Block pointer to any integer<br>int* xstgglobal g_pi;       // Global pointer to any integer<br><br>xstgglobal int* xstglocal  vp_li;   // Local pointer to global integer<br>xstglocal  int* xstgblock  vp_bi;   // Block pointer to local integer<br>xstgblock  int* xstgglobal vp_gi;   // Global pointer to block integer<br><br></div><div>These result in front end errors:<br><br>issue.c:13:7: error: expected identifier or '('<br>int * xstglocal  lp_i;       // Local pointer to any integer<br>      ^<br>issue.c:14:7: error: expected identifier or '('<br>int * xstgblock  b_pi;       // Block pointer to any integer<br>      ^<br>issue.c:15:7: error: expected identifier or '('<br>int * xstgglobal g_pi;       // Global pointer to any integer<br>      ^<br>issue.c:20:18: error: expected identifier or '('<br>xstgglobal int * xstglocal  vp_li;   // Local pointer to global integer<br>                 ^<br>issue.c:21:18: error: expected identifier or '('<br>xstglocal  int * xstgblock  vp_bi;   // Block pointer to local integer<br>                 ^<br>issue.c:22:18: error: expected identifier or '('<br>xstgblock  int * xstgglobal vp_gi;   // Global pointer to block integer<br>                 ^<br>6 errors generated.<br><br></div><div>It looks as though these address space extension keywords were added in <br></div><div>TokenKinds.def:<br>// XSTG address space qualifiers<br>KEYWORD(xstgglobal                  , KEYXSTG)<br>KEYWORD(xstgblock                   , KEYXSTG)<br>KEYWORD(xstglocal                   , KEYXSTG)<br><br></div><div>As well as in Attr.td:<br><br>def XSTGLocalAddressSpace : TypeAttr {<br>  let Spellings = [Keyword<"xstglocal">];<br>  let Documentation = [Undocumented];<br>}<br><br>def XSTGBlockAddressSpace : TypeAttr {<br>  let Spellings = [Keyword<"xstgblock">];<br>  let Documentation = [Undocumented];<br>}<br><br>def XSTGGlobalAddressSpace : TypeAttr {<br>  let Spellings = [Keyword<"xstgglobal">];<br>  let Documentation = [Undocumented];<br>}<br><br></div><div>with some support in ParseDecl.cpp.<br><br></div><div>Was there an API change between clang 3.2 and 3.6 that might have broken this? Any pointers on how I might fix these errors?<br><br></div><div>Thanks.<br><br></div><div>Phil<br></div><div><br><br></div><div><br></div></div></div>