tree-pretty-print.c 95 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747
  1. /* Pretty formatting of GENERIC trees in C syntax.
  2. Copyright (C) 2001-2015 Free Software Foundation, Inc.
  3. Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
  4. This file is part of GCC.
  5. GCC is free software; you can redistribute it and/or modify it under
  6. the terms of the GNU General Public License as published by the Free
  7. Software Foundation; either version 3, or (at your option) any later
  8. version.
  9. GCC is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GCC; see the file COPYING3. If not see
  15. <http://www.gnu.org/licenses/>. */
  16. #include "config.h"
  17. #include "system.h"
  18. #include "coretypes.h"
  19. #include "tm.h"
  20. #include "hash-set.h"
  21. #include "machmode.h"
  22. #include "vec.h"
  23. #include "double-int.h"
  24. #include "input.h"
  25. #include "alias.h"
  26. #include "symtab.h"
  27. #include "wide-int.h"
  28. #include "inchash.h"
  29. #include "tree.h"
  30. #include "stor-layout.h"
  31. #include "hashtab.h"
  32. #include "hard-reg-set.h"
  33. #include "function.h"
  34. #include "rtl.h"
  35. #include "flags.h"
  36. #include "statistics.h"
  37. #include "real.h"
  38. #include "fixed-value.h"
  39. #include "insn-config.h"
  40. #include "expmed.h"
  41. #include "dojump.h"
  42. #include "explow.h"
  43. #include "calls.h"
  44. #include "emit-rtl.h"
  45. #include "varasm.h"
  46. #include "stmt.h"
  47. #include "expr.h"
  48. #include "tree-pretty-print.h"
  49. #include "gimple-expr.h"
  50. #include "predict.h"
  51. #include "hash-map.h"
  52. #include "is-a.h"
  53. #include "plugin-api.h"
  54. #include "ipa-ref.h"
  55. #include "cgraph.h"
  56. #include "langhooks.h"
  57. #include "tree-iterator.h"
  58. #include "tree-chrec.h"
  59. #include "dumpfile.h"
  60. #include "value-prof.h"
  61. #include "wide-int-print.h"
  62. #include "internal-fn.h"
  63. #include "gomp-constants.h"
  64. /* Local functions, macros and variables. */
  65. static const char *op_symbol (const_tree);
  66. static void pretty_print_string (pretty_printer *, const char*);
  67. static void newline_and_indent (pretty_printer *, int);
  68. static void maybe_init_pretty_print (FILE *);
  69. static void print_struct_decl (pretty_printer *, const_tree, int, int);
  70. static void do_niy (pretty_printer *, const_tree);
  71. #define INDENT(SPACE) do { \
  72. int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
  73. #define NIY do_niy (pp, node)
  74. static pretty_printer *tree_pp;
  75. /* Try to print something for an unknown tree code. */
  76. static void
  77. do_niy (pretty_printer *pp, const_tree node)
  78. {
  79. int i, len;
  80. pp_string (pp, "<<< Unknown tree: ");
  81. pp_string (pp, get_tree_code_name (TREE_CODE (node)));
  82. if (EXPR_P (node))
  83. {
  84. len = TREE_OPERAND_LENGTH (node);
  85. for (i = 0; i < len; ++i)
  86. {
  87. newline_and_indent (pp, 2);
  88. dump_generic_node (pp, TREE_OPERAND (node, i), 2, 0, false);
  89. }
  90. }
  91. pp_string (pp, " >>>");
  92. }
  93. /* Debugging function to print out a generic expression. */
  94. DEBUG_FUNCTION void
  95. debug_generic_expr (tree t)
  96. {
  97. print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
  98. fprintf (stderr, "\n");
  99. }
  100. /* Debugging function to print out a generic statement. */
  101. DEBUG_FUNCTION void
  102. debug_generic_stmt (tree t)
  103. {
  104. print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
  105. fprintf (stderr, "\n");
  106. }
  107. /* Debugging function to print out a chain of trees . */
  108. DEBUG_FUNCTION void
  109. debug_tree_chain (tree t)
  110. {
  111. hash_set<tree> seen;
  112. while (t)
  113. {
  114. print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
  115. fprintf (stderr, " ");
  116. t = TREE_CHAIN (t);
  117. if (seen.add (t))
  118. {
  119. fprintf (stderr, "... [cycled back to ");
  120. print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
  121. fprintf (stderr, "]");
  122. break;
  123. }
  124. }
  125. fprintf (stderr, "\n");
  126. }
  127. /* Prints declaration DECL to the FILE with details specified by FLAGS. */
  128. void
  129. print_generic_decl (FILE *file, tree decl, int flags)
  130. {
  131. maybe_init_pretty_print (file);
  132. print_declaration (tree_pp, decl, 2, flags);
  133. pp_write_text_to_stream (tree_pp);
  134. }
  135. /* Print tree T, and its successors, on file FILE. FLAGS specifies details
  136. to show in the dump. See TDF_* in dumpfile.h. */
  137. void
  138. print_generic_stmt (FILE *file, tree t, int flags)
  139. {
  140. maybe_init_pretty_print (file);
  141. dump_generic_node (tree_pp, t, 0, flags, true);
  142. pp_newline_and_flush (tree_pp);
  143. }
  144. /* Print tree T, and its successors, on file FILE. FLAGS specifies details
  145. to show in the dump. See TDF_* in dumpfile.h. The output is indented by
  146. INDENT spaces. */
  147. void
  148. print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
  149. {
  150. int i;
  151. maybe_init_pretty_print (file);
  152. for (i = 0; i < indent; i++)
  153. pp_space (tree_pp);
  154. dump_generic_node (tree_pp, t, indent, flags, true);
  155. pp_newline_and_flush (tree_pp);
  156. }
  157. /* Print a single expression T on file FILE. FLAGS specifies details to show
  158. in the dump. See TDF_* in dumpfile.h. */
  159. void
  160. print_generic_expr (FILE *file, tree t, int flags)
  161. {
  162. maybe_init_pretty_print (file);
  163. dump_generic_node (tree_pp, t, 0, flags, false);
  164. pp_flush (tree_pp);
  165. }
  166. /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
  167. in FLAGS. */
  168. static void
  169. dump_decl_name (pretty_printer *pp, tree node, int flags)
  170. {
  171. if (DECL_NAME (node))
  172. {
  173. if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node))
  174. pp_tree_identifier (pp, DECL_ASSEMBLER_NAME (node));
  175. else
  176. pp_tree_identifier (pp, DECL_NAME (node));
  177. }
  178. if ((flags & TDF_UID) || DECL_NAME (node) == NULL_TREE)
  179. {
  180. if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
  181. pp_printf (pp, "L.%d", (int) LABEL_DECL_UID (node));
  182. else if (TREE_CODE (node) == DEBUG_EXPR_DECL)
  183. {
  184. if (flags & TDF_NOUID)
  185. pp_string (pp, "D#xxxx");
  186. else
  187. pp_printf (pp, "D#%i", DEBUG_TEMP_UID (node));
  188. }
  189. else
  190. {
  191. char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
  192. if (flags & TDF_NOUID)
  193. pp_printf (pp, "%c.xxxx", c);
  194. else
  195. pp_printf (pp, "%c.%u", c, DECL_UID (node));
  196. }
  197. }
  198. if ((flags & TDF_ALIAS) && DECL_PT_UID (node) != DECL_UID (node))
  199. {
  200. if (flags & TDF_NOUID)
  201. pp_printf (pp, "ptD.xxxx");
  202. else
  203. pp_printf (pp, "ptD.%u", DECL_PT_UID (node));
  204. }
  205. }
  206. /* Like the above, but used for pretty printing function calls. */
  207. static void
  208. dump_function_name (pretty_printer *pp, tree node, int flags)
  209. {
  210. if (CONVERT_EXPR_P (node))
  211. node = TREE_OPERAND (node, 0);
  212. if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0)
  213. pp_string (pp, lang_hooks.decl_printable_name (node, 1));
  214. else
  215. dump_decl_name (pp, node, flags);
  216. }
  217. /* Dump a function declaration. NODE is the FUNCTION_TYPE. PP, SPC and
  218. FLAGS are as in dump_generic_node. */
  219. static void
  220. dump_function_declaration (pretty_printer *pp, tree node,
  221. int spc, int flags)
  222. {
  223. bool wrote_arg = false;
  224. tree arg;
  225. pp_space (pp);
  226. pp_left_paren (pp);
  227. /* Print the argument types. */
  228. arg = TYPE_ARG_TYPES (node);
  229. while (arg && arg != void_list_node && arg != error_mark_node)
  230. {
  231. if (wrote_arg)
  232. {
  233. pp_comma (pp);
  234. pp_space (pp);
  235. }
  236. wrote_arg = true;
  237. dump_generic_node (pp, TREE_VALUE (arg), spc, flags, false);
  238. arg = TREE_CHAIN (arg);
  239. }
  240. /* Drop the trailing void_type_node if we had any previous argument. */
  241. if (arg == void_list_node && !wrote_arg)
  242. pp_string (pp, "void");
  243. /* Properly dump vararg function types. */
  244. else if (!arg && wrote_arg)
  245. pp_string (pp, ", ...");
  246. /* Avoid printing any arg for unprototyped functions. */
  247. pp_right_paren (pp);
  248. }
  249. /* Dump the domain associated with an array. */
  250. static void
  251. dump_array_domain (pretty_printer *pp, tree domain, int spc, int flags)
  252. {
  253. pp_left_bracket (pp);
  254. if (domain)
  255. {
  256. tree min = TYPE_MIN_VALUE (domain);
  257. tree max = TYPE_MAX_VALUE (domain);
  258. if (min && max
  259. && integer_zerop (min)
  260. && tree_fits_shwi_p (max))
  261. pp_wide_integer (pp, tree_to_shwi (max) + 1);
  262. else
  263. {
  264. if (min)
  265. dump_generic_node (pp, min, spc, flags, false);
  266. pp_colon (pp);
  267. if (max)
  268. dump_generic_node (pp, max, spc, flags, false);
  269. }
  270. }
  271. else
  272. pp_string (pp, "<unknown>");
  273. pp_right_bracket (pp);
  274. }
  275. /* Dump OpenMP clause CLAUSE. PP, CLAUSE, SPC and FLAGS are as in
  276. dump_generic_node. */
  277. static void
  278. dump_omp_clause (pretty_printer *pp, tree clause, int spc, int flags)
  279. {
  280. const char *name;
  281. switch (OMP_CLAUSE_CODE (clause))
  282. {
  283. case OMP_CLAUSE_PRIVATE:
  284. name = "private";
  285. goto print_remap;
  286. case OMP_CLAUSE_SHARED:
  287. name = "shared";
  288. goto print_remap;
  289. case OMP_CLAUSE_FIRSTPRIVATE:
  290. name = "firstprivate";
  291. goto print_remap;
  292. case OMP_CLAUSE_LASTPRIVATE:
  293. name = "lastprivate";
  294. goto print_remap;
  295. case OMP_CLAUSE_COPYIN:
  296. name = "copyin";
  297. goto print_remap;
  298. case OMP_CLAUSE_COPYPRIVATE:
  299. name = "copyprivate";
  300. goto print_remap;
  301. case OMP_CLAUSE_UNIFORM:
  302. name = "uniform";
  303. goto print_remap;
  304. case OMP_CLAUSE__LOOPTEMP_:
  305. name = "_looptemp_";
  306. goto print_remap;
  307. case OMP_CLAUSE_DEVICE_RESIDENT:
  308. name = "device_resident";
  309. goto print_remap;
  310. case OMP_CLAUSE_USE_DEVICE:
  311. name = "use_device";
  312. goto print_remap;
  313. print_remap:
  314. pp_string (pp, name);
  315. pp_left_paren (pp);
  316. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  317. spc, flags, false);
  318. pp_right_paren (pp);
  319. break;
  320. case OMP_CLAUSE_REDUCTION:
  321. pp_string (pp, "reduction(");
  322. if (OMP_CLAUSE_REDUCTION_CODE (clause) != ERROR_MARK)
  323. {
  324. pp_string (pp,
  325. op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
  326. pp_colon (pp);
  327. }
  328. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  329. spc, flags, false);
  330. pp_right_paren (pp);
  331. break;
  332. case OMP_CLAUSE_IF:
  333. pp_string (pp, "if(");
  334. dump_generic_node (pp, OMP_CLAUSE_IF_EXPR (clause),
  335. spc, flags, false);
  336. pp_right_paren (pp);
  337. break;
  338. case OMP_CLAUSE_NUM_THREADS:
  339. pp_string (pp, "num_threads(");
  340. dump_generic_node (pp, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
  341. spc, flags, false);
  342. pp_right_paren (pp);
  343. break;
  344. case OMP_CLAUSE__CILK_FOR_COUNT_:
  345. pp_string (pp, "_Cilk_for_count_(");
  346. dump_generic_node (pp, OMP_CLAUSE_OPERAND (clause, 0),
  347. spc, flags, false);
  348. pp_right_paren (pp);
  349. break;
  350. case OMP_CLAUSE_NOWAIT:
  351. pp_string (pp, "nowait");
  352. break;
  353. case OMP_CLAUSE_ORDERED:
  354. pp_string (pp, "ordered");
  355. break;
  356. case OMP_CLAUSE_DEFAULT:
  357. pp_string (pp, "default(");
  358. switch (OMP_CLAUSE_DEFAULT_KIND (clause))
  359. {
  360. case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
  361. break;
  362. case OMP_CLAUSE_DEFAULT_SHARED:
  363. pp_string (pp, "shared");
  364. break;
  365. case OMP_CLAUSE_DEFAULT_NONE:
  366. pp_string (pp, "none");
  367. break;
  368. case OMP_CLAUSE_DEFAULT_PRIVATE:
  369. pp_string (pp, "private");
  370. break;
  371. case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
  372. pp_string (pp, "firstprivate");
  373. break;
  374. default:
  375. gcc_unreachable ();
  376. }
  377. pp_right_paren (pp);
  378. break;
  379. case OMP_CLAUSE_SCHEDULE:
  380. pp_string (pp, "schedule(");
  381. switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
  382. {
  383. case OMP_CLAUSE_SCHEDULE_STATIC:
  384. pp_string (pp, "static");
  385. break;
  386. case OMP_CLAUSE_SCHEDULE_DYNAMIC:
  387. pp_string (pp, "dynamic");
  388. break;
  389. case OMP_CLAUSE_SCHEDULE_GUIDED:
  390. pp_string (pp, "guided");
  391. break;
  392. case OMP_CLAUSE_SCHEDULE_RUNTIME:
  393. pp_string (pp, "runtime");
  394. break;
  395. case OMP_CLAUSE_SCHEDULE_AUTO:
  396. pp_string (pp, "auto");
  397. break;
  398. case OMP_CLAUSE_SCHEDULE_CILKFOR:
  399. pp_string (pp, "cilk-for grain");
  400. break;
  401. default:
  402. gcc_unreachable ();
  403. }
  404. if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
  405. {
  406. pp_comma (pp);
  407. dump_generic_node (pp, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
  408. spc, flags, false);
  409. }
  410. pp_right_paren (pp);
  411. break;
  412. case OMP_CLAUSE_UNTIED:
  413. pp_string (pp, "untied");
  414. break;
  415. case OMP_CLAUSE_COLLAPSE:
  416. pp_string (pp, "collapse(");
  417. dump_generic_node (pp, OMP_CLAUSE_COLLAPSE_EXPR (clause),
  418. spc, flags, false);
  419. pp_right_paren (pp);
  420. break;
  421. case OMP_CLAUSE_FINAL:
  422. pp_string (pp, "final(");
  423. dump_generic_node (pp, OMP_CLAUSE_FINAL_EXPR (clause),
  424. spc, flags, false);
  425. pp_right_paren (pp);
  426. break;
  427. case OMP_CLAUSE_MERGEABLE:
  428. pp_string (pp, "mergeable");
  429. break;
  430. case OMP_CLAUSE_LINEAR:
  431. pp_string (pp, "linear(");
  432. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  433. spc, flags, false);
  434. pp_colon (pp);
  435. dump_generic_node (pp, OMP_CLAUSE_LINEAR_STEP (clause),
  436. spc, flags, false);
  437. pp_right_paren (pp);
  438. break;
  439. case OMP_CLAUSE_ALIGNED:
  440. pp_string (pp, "aligned(");
  441. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  442. spc, flags, false);
  443. if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
  444. {
  445. pp_colon (pp);
  446. dump_generic_node (pp, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause),
  447. spc, flags, false);
  448. }
  449. pp_right_paren (pp);
  450. break;
  451. case OMP_CLAUSE_DEPEND:
  452. pp_string (pp, "depend(");
  453. switch (OMP_CLAUSE_DEPEND_KIND (clause))
  454. {
  455. case OMP_CLAUSE_DEPEND_IN:
  456. pp_string (pp, "in");
  457. break;
  458. case OMP_CLAUSE_DEPEND_OUT:
  459. pp_string (pp, "out");
  460. break;
  461. case OMP_CLAUSE_DEPEND_INOUT:
  462. pp_string (pp, "inout");
  463. break;
  464. default:
  465. gcc_unreachable ();
  466. }
  467. pp_colon (pp);
  468. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  469. spc, flags, false);
  470. pp_right_paren (pp);
  471. break;
  472. case OMP_CLAUSE_MAP:
  473. pp_string (pp, "map(");
  474. switch (OMP_CLAUSE_MAP_KIND (clause))
  475. {
  476. case GOMP_MAP_ALLOC:
  477. case GOMP_MAP_POINTER:
  478. pp_string (pp, "alloc");
  479. break;
  480. case GOMP_MAP_TO:
  481. case GOMP_MAP_TO_PSET:
  482. pp_string (pp, "to");
  483. break;
  484. case GOMP_MAP_FROM:
  485. pp_string (pp, "from");
  486. break;
  487. case GOMP_MAP_TOFROM:
  488. pp_string (pp, "tofrom");
  489. break;
  490. case GOMP_MAP_FORCE_ALLOC:
  491. pp_string (pp, "force_alloc");
  492. break;
  493. case GOMP_MAP_FORCE_TO:
  494. pp_string (pp, "force_to");
  495. break;
  496. case GOMP_MAP_FORCE_FROM:
  497. pp_string (pp, "force_from");
  498. break;
  499. case GOMP_MAP_FORCE_TOFROM:
  500. pp_string (pp, "force_tofrom");
  501. break;
  502. case GOMP_MAP_FORCE_PRESENT:
  503. pp_string (pp, "force_present");
  504. break;
  505. case GOMP_MAP_FORCE_DEALLOC:
  506. pp_string (pp, "force_dealloc");
  507. break;
  508. case GOMP_MAP_FORCE_DEVICEPTR:
  509. pp_string (pp, "force_deviceptr");
  510. break;
  511. default:
  512. gcc_unreachable ();
  513. }
  514. pp_colon (pp);
  515. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  516. spc, flags, false);
  517. print_clause_size:
  518. if (OMP_CLAUSE_SIZE (clause))
  519. {
  520. if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
  521. && OMP_CLAUSE_MAP_KIND (clause) == GOMP_MAP_POINTER)
  522. pp_string (pp, " [pointer assign, bias: ");
  523. else if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
  524. && OMP_CLAUSE_MAP_KIND (clause) == GOMP_MAP_TO_PSET)
  525. pp_string (pp, " [pointer set, len: ");
  526. else
  527. pp_string (pp, " [len: ");
  528. dump_generic_node (pp, OMP_CLAUSE_SIZE (clause),
  529. spc, flags, false);
  530. pp_right_bracket (pp);
  531. }
  532. pp_right_paren (pp);
  533. break;
  534. case OMP_CLAUSE_FROM:
  535. pp_string (pp, "from(");
  536. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  537. spc, flags, false);
  538. goto print_clause_size;
  539. case OMP_CLAUSE_TO:
  540. pp_string (pp, "to(");
  541. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  542. spc, flags, false);
  543. goto print_clause_size;
  544. case OMP_CLAUSE__CACHE_:
  545. pp_string (pp, "(");
  546. dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
  547. spc, flags, false);
  548. goto print_clause_size;
  549. case OMP_CLAUSE_NUM_TEAMS:
  550. pp_string (pp, "num_teams(");
  551. dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_EXPR (clause),
  552. spc, flags, false);
  553. pp_right_paren (pp);
  554. break;
  555. case OMP_CLAUSE_THREAD_LIMIT:
  556. pp_string (pp, "thread_limit(");
  557. dump_generic_node (pp, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
  558. spc, flags, false);
  559. pp_right_paren (pp);
  560. break;
  561. case OMP_CLAUSE_DEVICE:
  562. pp_string (pp, "device(");
  563. dump_generic_node (pp, OMP_CLAUSE_DEVICE_ID (clause),
  564. spc, flags, false);
  565. pp_right_paren (pp);
  566. break;
  567. case OMP_CLAUSE_DIST_SCHEDULE:
  568. pp_string (pp, "dist_schedule(static");
  569. if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
  570. {
  571. pp_comma (pp);
  572. dump_generic_node (pp,
  573. OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
  574. spc, flags, false);
  575. }
  576. pp_right_paren (pp);
  577. break;
  578. case OMP_CLAUSE_PROC_BIND:
  579. pp_string (pp, "proc_bind(");
  580. switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
  581. {
  582. case OMP_CLAUSE_PROC_BIND_MASTER:
  583. pp_string (pp, "master");
  584. break;
  585. case OMP_CLAUSE_PROC_BIND_CLOSE:
  586. pp_string (pp, "close");
  587. break;
  588. case OMP_CLAUSE_PROC_BIND_SPREAD:
  589. pp_string (pp, "spread");
  590. break;
  591. default:
  592. gcc_unreachable ();
  593. }
  594. pp_right_paren (pp);
  595. break;
  596. case OMP_CLAUSE_SAFELEN:
  597. pp_string (pp, "safelen(");
  598. dump_generic_node (pp, OMP_CLAUSE_SAFELEN_EXPR (clause),
  599. spc, flags, false);
  600. pp_right_paren (pp);
  601. break;
  602. case OMP_CLAUSE_SIMDLEN:
  603. pp_string (pp, "simdlen(");
  604. dump_generic_node (pp, OMP_CLAUSE_SIMDLEN_EXPR (clause),
  605. spc, flags, false);
  606. pp_right_paren (pp);
  607. break;
  608. case OMP_CLAUSE__SIMDUID_:
  609. pp_string (pp, "_simduid_(");
  610. dump_generic_node (pp, OMP_CLAUSE__SIMDUID__DECL (clause),
  611. spc, flags, false);
  612. pp_right_paren (pp);
  613. break;
  614. case OMP_CLAUSE_GANG:
  615. pp_string (pp, "gang");
  616. if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE)
  617. {
  618. pp_string (pp, "(num: ");
  619. dump_generic_node (pp, OMP_CLAUSE_GANG_EXPR (clause),
  620. spc, flags, false);
  621. }
  622. if (OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
  623. {
  624. if (OMP_CLAUSE_GANG_EXPR (clause) == NULL_TREE)
  625. pp_left_paren (pp);
  626. else
  627. pp_space (pp);
  628. pp_string (pp, "static:");
  629. if (OMP_CLAUSE_GANG_STATIC_EXPR (clause)
  630. == integer_minus_one_node)
  631. pp_character (pp, '*');
  632. else
  633. dump_generic_node (pp, OMP_CLAUSE_GANG_STATIC_EXPR (clause),
  634. spc, flags, false);
  635. }
  636. if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE
  637. || OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
  638. pp_right_paren (pp);
  639. break;
  640. case OMP_CLAUSE_ASYNC:
  641. pp_string (pp, "async");
  642. if (OMP_CLAUSE_ASYNC_EXPR (clause))
  643. {
  644. pp_character(pp, '(');
  645. dump_generic_node (pp, OMP_CLAUSE_ASYNC_EXPR (clause),
  646. spc, flags, false);
  647. pp_character(pp, ')');
  648. }
  649. break;
  650. case OMP_CLAUSE_AUTO:
  651. case OMP_CLAUSE_SEQ:
  652. pp_string (pp, omp_clause_code_name[OMP_CLAUSE_CODE (clause)]);
  653. break;
  654. case OMP_CLAUSE_WAIT:
  655. pp_string (pp, "wait(");
  656. dump_generic_node (pp, OMP_CLAUSE_WAIT_EXPR (clause),
  657. spc, flags, false);
  658. pp_character(pp, ')');
  659. break;
  660. case OMP_CLAUSE_WORKER:
  661. pp_string (pp, "worker");
  662. if (OMP_CLAUSE_WORKER_EXPR (clause) != NULL_TREE)
  663. {
  664. pp_left_paren (pp);
  665. dump_generic_node (pp, OMP_CLAUSE_WORKER_EXPR (clause),
  666. spc, flags, false);
  667. pp_right_paren (pp);
  668. }
  669. break;
  670. case OMP_CLAUSE_VECTOR:
  671. pp_string (pp, "vector");
  672. if (OMP_CLAUSE_VECTOR_EXPR (clause) != NULL_TREE)
  673. {
  674. pp_left_paren (pp);
  675. dump_generic_node (pp, OMP_CLAUSE_VECTOR_EXPR (clause),
  676. spc, flags, false);
  677. pp_right_paren (pp);
  678. }
  679. break;
  680. case OMP_CLAUSE_NUM_GANGS:
  681. pp_string (pp, "num_gangs(");
  682. dump_generic_node (pp, OMP_CLAUSE_NUM_GANGS_EXPR (clause),
  683. spc, flags, false);
  684. pp_character (pp, ')');
  685. break;
  686. case OMP_CLAUSE_NUM_WORKERS:
  687. pp_string (pp, "num_workers(");
  688. dump_generic_node (pp, OMP_CLAUSE_NUM_WORKERS_EXPR (clause),
  689. spc, flags, false);
  690. pp_character (pp, ')');
  691. break;
  692. case OMP_CLAUSE_VECTOR_LENGTH:
  693. pp_string (pp, "vector_length(");
  694. dump_generic_node (pp, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause),
  695. spc, flags, false);
  696. pp_character (pp, ')');
  697. break;
  698. case OMP_CLAUSE_INBRANCH:
  699. pp_string (pp, "inbranch");
  700. break;
  701. case OMP_CLAUSE_NOTINBRANCH:
  702. pp_string (pp, "notinbranch");
  703. break;
  704. case OMP_CLAUSE_FOR:
  705. pp_string (pp, "for");
  706. break;
  707. case OMP_CLAUSE_PARALLEL:
  708. pp_string (pp, "parallel");
  709. break;
  710. case OMP_CLAUSE_SECTIONS:
  711. pp_string (pp, "sections");
  712. break;
  713. case OMP_CLAUSE_TASKGROUP:
  714. pp_string (pp, "taskgroup");
  715. break;
  716. case OMP_CLAUSE_INDEPENDENT:
  717. pp_string (pp, "independent");
  718. break;
  719. default:
  720. /* Should never happen. */
  721. dump_generic_node (pp, clause, spc, flags, false);
  722. break;
  723. }
  724. }
  725. /* Dump the list of OpenMP clauses. PP, SPC and FLAGS are as in
  726. dump_generic_node. */
  727. void
  728. dump_omp_clauses (pretty_printer *pp, tree clause, int spc, int flags)
  729. {
  730. if (clause == NULL)
  731. return;
  732. pp_space (pp);
  733. while (1)
  734. {
  735. dump_omp_clause (pp, clause, spc, flags);
  736. clause = OMP_CLAUSE_CHAIN (clause);
  737. if (clause == NULL)
  738. return;
  739. pp_space (pp);
  740. }
  741. }
  742. /* Dump location LOC to PP. */
  743. void
  744. dump_location (pretty_printer *pp, location_t loc)
  745. {
  746. expanded_location xloc = expand_location (loc);
  747. pp_left_bracket (pp);
  748. if (xloc.file)
  749. {
  750. pp_string (pp, xloc.file);
  751. pp_string (pp, ":");
  752. }
  753. pp_decimal_int (pp, xloc.line);
  754. pp_colon (pp);
  755. pp_decimal_int (pp, xloc.column);
  756. pp_string (pp, "] ");
  757. }
  758. /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
  759. dump_generic_node. */
  760. static void
  761. dump_block_node (pretty_printer *pp, tree block, int spc, int flags)
  762. {
  763. tree t;
  764. pp_printf (pp, "BLOCK #%d ", BLOCK_NUMBER (block));
  765. if (flags & TDF_ADDRESS)
  766. pp_printf (pp, "[%p] ", (void *) block);
  767. if (BLOCK_ABSTRACT (block))
  768. pp_string (pp, "[abstract] ");
  769. if (TREE_ASM_WRITTEN (block))
  770. pp_string (pp, "[written] ");
  771. if (flags & TDF_SLIM)
  772. return;
  773. if (BLOCK_SOURCE_LOCATION (block))
  774. dump_location (pp, BLOCK_SOURCE_LOCATION (block));
  775. newline_and_indent (pp, spc + 2);
  776. if (BLOCK_SUPERCONTEXT (block))
  777. {
  778. pp_string (pp, "SUPERCONTEXT: ");
  779. dump_generic_node (pp, BLOCK_SUPERCONTEXT (block), 0,
  780. flags | TDF_SLIM, false);
  781. newline_and_indent (pp, spc + 2);
  782. }
  783. if (BLOCK_SUBBLOCKS (block))
  784. {
  785. pp_string (pp, "SUBBLOCKS: ");
  786. for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
  787. {
  788. dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
  789. pp_space (pp);
  790. }
  791. newline_and_indent (pp, spc + 2);
  792. }
  793. if (BLOCK_CHAIN (block))
  794. {
  795. pp_string (pp, "SIBLINGS: ");
  796. for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
  797. {
  798. dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
  799. pp_space (pp);
  800. }
  801. newline_and_indent (pp, spc + 2);
  802. }
  803. if (BLOCK_VARS (block))
  804. {
  805. pp_string (pp, "VARS: ");
  806. for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
  807. {
  808. dump_generic_node (pp, t, 0, flags, false);
  809. pp_space (pp);
  810. }
  811. newline_and_indent (pp, spc + 2);
  812. }
  813. if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
  814. {
  815. unsigned i;
  816. vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
  817. pp_string (pp, "NONLOCALIZED_VARS: ");
  818. FOR_EACH_VEC_ELT (*nlv, i, t)
  819. {
  820. dump_generic_node (pp, t, 0, flags, false);
  821. pp_space (pp);
  822. }
  823. newline_and_indent (pp, spc + 2);
  824. }
  825. if (BLOCK_ABSTRACT_ORIGIN (block))
  826. {
  827. pp_string (pp, "ABSTRACT_ORIGIN: ");
  828. dump_generic_node (pp, BLOCK_ABSTRACT_ORIGIN (block), 0,
  829. flags | TDF_SLIM, false);
  830. newline_and_indent (pp, spc + 2);
  831. }
  832. if (BLOCK_FRAGMENT_ORIGIN (block))
  833. {
  834. pp_string (pp, "FRAGMENT_ORIGIN: ");
  835. dump_generic_node (pp, BLOCK_FRAGMENT_ORIGIN (block), 0,
  836. flags | TDF_SLIM, false);
  837. newline_and_indent (pp, spc + 2);
  838. }
  839. if (BLOCK_FRAGMENT_CHAIN (block))
  840. {
  841. pp_string (pp, "FRAGMENT_CHAIN: ");
  842. for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
  843. {
  844. dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
  845. pp_space (pp);
  846. }
  847. newline_and_indent (pp, spc + 2);
  848. }
  849. }
  850. /* Dump the node NODE on the pretty_printer PP, SPC spaces of
  851. indent. FLAGS specifies details to show in the dump (see TDF_* in
  852. dumpfile.h). If IS_STMT is true, the object printed is considered
  853. to be a statement and it is terminated by ';' if appropriate. */
  854. int
  855. dump_generic_node (pretty_printer *pp, tree node, int spc, int flags,
  856. bool is_stmt)
  857. {
  858. tree type;
  859. tree op0, op1;
  860. const char *str;
  861. bool is_expr;
  862. enum tree_code code;
  863. if (node == NULL_TREE)
  864. return spc;
  865. is_expr = EXPR_P (node);
  866. if (is_stmt && (flags & TDF_STMTADDR))
  867. pp_printf (pp, "<&%p> ", (void *)node);
  868. if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
  869. dump_location (pp, EXPR_LOCATION (node));
  870. code = TREE_CODE (node);
  871. switch (code)
  872. {
  873. case ERROR_MARK:
  874. pp_string (pp, "<<< error >>>");
  875. break;
  876. case IDENTIFIER_NODE:
  877. pp_tree_identifier (pp, node);
  878. break;
  879. case TREE_LIST:
  880. while (node && node != error_mark_node)
  881. {
  882. if (TREE_PURPOSE (node))
  883. {
  884. dump_generic_node (pp, TREE_PURPOSE (node), spc, flags, false);
  885. pp_space (pp);
  886. }
  887. dump_generic_node (pp, TREE_VALUE (node), spc, flags, false);
  888. node = TREE_CHAIN (node);
  889. if (node && TREE_CODE (node) == TREE_LIST)
  890. {
  891. pp_comma (pp);
  892. pp_space (pp);
  893. }
  894. }
  895. break;
  896. case TREE_BINFO:
  897. dump_generic_node (pp, BINFO_TYPE (node), spc, flags, false);
  898. break;
  899. case TREE_VEC:
  900. {
  901. size_t i;
  902. if (TREE_VEC_LENGTH (node) > 0)
  903. {
  904. size_t len = TREE_VEC_LENGTH (node);
  905. for (i = 0; i < len - 1; i++)
  906. {
  907. dump_generic_node (pp, TREE_VEC_ELT (node, i), spc, flags,
  908. false);
  909. pp_comma (pp);
  910. pp_space (pp);
  911. }
  912. dump_generic_node (pp, TREE_VEC_ELT (node, len - 1), spc,
  913. flags, false);
  914. }
  915. }
  916. break;
  917. case VOID_TYPE:
  918. case POINTER_BOUNDS_TYPE:
  919. case INTEGER_TYPE:
  920. case REAL_TYPE:
  921. case FIXED_POINT_TYPE:
  922. case COMPLEX_TYPE:
  923. case VECTOR_TYPE:
  924. case ENUMERAL_TYPE:
  925. case BOOLEAN_TYPE:
  926. {
  927. unsigned int quals = TYPE_QUALS (node);
  928. enum tree_code_class tclass;
  929. if (quals & TYPE_QUAL_ATOMIC)
  930. pp_string (pp, "atomic ");
  931. if (quals & TYPE_QUAL_CONST)
  932. pp_string (pp, "const ");
  933. else if (quals & TYPE_QUAL_VOLATILE)
  934. pp_string (pp, "volatile ");
  935. else if (quals & TYPE_QUAL_RESTRICT)
  936. pp_string (pp, "restrict ");
  937. if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
  938. {
  939. pp_string (pp, "<address-space-");
  940. pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
  941. pp_string (pp, "> ");
  942. }
  943. tclass = TREE_CODE_CLASS (TREE_CODE (node));
  944. if (tclass == tcc_declaration)
  945. {
  946. if (DECL_NAME (node))
  947. dump_decl_name (pp, node, flags);
  948. else
  949. pp_string (pp, "<unnamed type decl>");
  950. }
  951. else if (tclass == tcc_type)
  952. {
  953. if (TYPE_NAME (node))
  954. {
  955. if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
  956. pp_tree_identifier (pp, TYPE_NAME (node));
  957. else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
  958. && DECL_NAME (TYPE_NAME (node)))
  959. dump_decl_name (pp, TYPE_NAME (node), flags);
  960. else
  961. pp_string (pp, "<unnamed type>");
  962. }
  963. else if (TREE_CODE (node) == VECTOR_TYPE)
  964. {
  965. pp_string (pp, "vector");
  966. pp_left_paren (pp);
  967. pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (node));
  968. pp_string (pp, ") ");
  969. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  970. }
  971. else if (TREE_CODE (node) == INTEGER_TYPE)
  972. {
  973. if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
  974. pp_string (pp, (TYPE_UNSIGNED (node)
  975. ? "unsigned char"
  976. : "signed char"));
  977. else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
  978. pp_string (pp, (TYPE_UNSIGNED (node)
  979. ? "unsigned short"
  980. : "signed short"));
  981. else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
  982. pp_string (pp, (TYPE_UNSIGNED (node)
  983. ? "unsigned int"
  984. : "signed int"));
  985. else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
  986. pp_string (pp, (TYPE_UNSIGNED (node)
  987. ? "unsigned long"
  988. : "signed long"));
  989. else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
  990. pp_string (pp, (TYPE_UNSIGNED (node)
  991. ? "unsigned long long"
  992. : "signed long long"));
  993. else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
  994. && exact_log2 (TYPE_PRECISION (node)) != -1)
  995. {
  996. pp_string (pp, (TYPE_UNSIGNED (node) ? "uint" : "int"));
  997. pp_decimal_int (pp, TYPE_PRECISION (node));
  998. pp_string (pp, "_t");
  999. }
  1000. else
  1001. {
  1002. pp_string (pp, (TYPE_UNSIGNED (node)
  1003. ? "<unnamed-unsigned:"
  1004. : "<unnamed-signed:"));
  1005. pp_decimal_int (pp, TYPE_PRECISION (node));
  1006. pp_greater (pp);
  1007. }
  1008. }
  1009. else if (TREE_CODE (node) == COMPLEX_TYPE)
  1010. {
  1011. pp_string (pp, "__complex__ ");
  1012. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1013. }
  1014. else if (TREE_CODE (node) == REAL_TYPE)
  1015. {
  1016. pp_string (pp, "<float:");
  1017. pp_decimal_int (pp, TYPE_PRECISION (node));
  1018. pp_greater (pp);
  1019. }
  1020. else if (TREE_CODE (node) == FIXED_POINT_TYPE)
  1021. {
  1022. pp_string (pp, "<fixed-point-");
  1023. pp_string (pp, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
  1024. pp_decimal_int (pp, TYPE_PRECISION (node));
  1025. pp_greater (pp);
  1026. }
  1027. else if (TREE_CODE (node) == VOID_TYPE)
  1028. pp_string (pp, "void");
  1029. else
  1030. pp_string (pp, "<unnamed type>");
  1031. }
  1032. break;
  1033. }
  1034. case POINTER_TYPE:
  1035. case REFERENCE_TYPE:
  1036. str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
  1037. if (TREE_TYPE (node) == NULL)
  1038. {
  1039. pp_string (pp, str);
  1040. pp_string (pp, "<null type>");
  1041. }
  1042. else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
  1043. {
  1044. tree fnode = TREE_TYPE (node);
  1045. dump_generic_node (pp, TREE_TYPE (fnode), spc, flags, false);
  1046. pp_space (pp);
  1047. pp_left_paren (pp);
  1048. pp_string (pp, str);
  1049. if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
  1050. dump_decl_name (pp, TYPE_NAME (node), flags);
  1051. else if (flags & TDF_NOUID)
  1052. pp_printf (pp, "<Txxxx>");
  1053. else
  1054. pp_printf (pp, "<T%x>", TYPE_UID (node));
  1055. pp_right_paren (pp);
  1056. dump_function_declaration (pp, fnode, spc, flags);
  1057. }
  1058. else
  1059. {
  1060. unsigned int quals = TYPE_QUALS (node);
  1061. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1062. pp_space (pp);
  1063. pp_string (pp, str);
  1064. if (quals & TYPE_QUAL_CONST)
  1065. pp_string (pp, " const");
  1066. if (quals & TYPE_QUAL_VOLATILE)
  1067. pp_string (pp, " volatile");
  1068. if (quals & TYPE_QUAL_RESTRICT)
  1069. pp_string (pp, " restrict");
  1070. if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
  1071. {
  1072. pp_string (pp, " <address-space-");
  1073. pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
  1074. pp_greater (pp);
  1075. }
  1076. if (TYPE_REF_CAN_ALIAS_ALL (node))
  1077. pp_string (pp, " {ref-all}");
  1078. }
  1079. break;
  1080. case OFFSET_TYPE:
  1081. NIY;
  1082. break;
  1083. case MEM_REF:
  1084. {
  1085. if (integer_zerop (TREE_OPERAND (node, 1))
  1086. /* Dump the types of INTEGER_CSTs explicitly, for we can't
  1087. infer them and MEM_ATTR caching will share MEM_REFs
  1088. with differently-typed op0s. */
  1089. && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
  1090. /* Released SSA_NAMES have no TREE_TYPE. */
  1091. && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
  1092. /* Same pointer types, but ignoring POINTER_TYPE vs.
  1093. REFERENCE_TYPE. */
  1094. && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
  1095. == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
  1096. && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
  1097. == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
  1098. && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
  1099. == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
  1100. /* Same value types ignoring qualifiers. */
  1101. && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
  1102. == TYPE_MAIN_VARIANT
  1103. (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1)))))
  1104. && (!(flags & TDF_ALIAS)
  1105. || MR_DEPENDENCE_CLIQUE (node) == 0))
  1106. {
  1107. if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
  1108. {
  1109. pp_star (pp);
  1110. dump_generic_node (pp, TREE_OPERAND (node, 0),
  1111. spc, flags, false);
  1112. }
  1113. else
  1114. dump_generic_node (pp,
  1115. TREE_OPERAND (TREE_OPERAND (node, 0), 0),
  1116. spc, flags, false);
  1117. }
  1118. else
  1119. {
  1120. tree ptype;
  1121. pp_string (pp, "MEM[");
  1122. pp_left_paren (pp);
  1123. ptype = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node, 1)));
  1124. dump_generic_node (pp, ptype,
  1125. spc, flags | TDF_SLIM, false);
  1126. pp_right_paren (pp);
  1127. dump_generic_node (pp, TREE_OPERAND (node, 0),
  1128. spc, flags, false);
  1129. if (!integer_zerop (TREE_OPERAND (node, 1)))
  1130. {
  1131. pp_string (pp, " + ");
  1132. dump_generic_node (pp, TREE_OPERAND (node, 1),
  1133. spc, flags, false);
  1134. }
  1135. if ((flags & TDF_ALIAS)
  1136. && MR_DEPENDENCE_CLIQUE (node) != 0)
  1137. {
  1138. pp_string (pp, " clique ");
  1139. pp_unsigned_wide_integer (pp, MR_DEPENDENCE_CLIQUE (node));
  1140. pp_string (pp, " base ");
  1141. pp_unsigned_wide_integer (pp, MR_DEPENDENCE_BASE (node));
  1142. }
  1143. pp_right_bracket (pp);
  1144. }
  1145. break;
  1146. }
  1147. case TARGET_MEM_REF:
  1148. {
  1149. const char *sep = "";
  1150. tree tmp;
  1151. pp_string (pp, "MEM[");
  1152. if (TREE_CODE (TMR_BASE (node)) == ADDR_EXPR)
  1153. {
  1154. pp_string (pp, sep);
  1155. sep = ", ";
  1156. pp_string (pp, "symbol: ");
  1157. dump_generic_node (pp, TREE_OPERAND (TMR_BASE (node), 0),
  1158. spc, flags, false);
  1159. }
  1160. else
  1161. {
  1162. pp_string (pp, sep);
  1163. sep = ", ";
  1164. pp_string (pp, "base: ");
  1165. dump_generic_node (pp, TMR_BASE (node), spc, flags, false);
  1166. }
  1167. tmp = TMR_INDEX2 (node);
  1168. if (tmp)
  1169. {
  1170. pp_string (pp, sep);
  1171. sep = ", ";
  1172. pp_string (pp, "base: ");
  1173. dump_generic_node (pp, tmp, spc, flags, false);
  1174. }
  1175. tmp = TMR_INDEX (node);
  1176. if (tmp)
  1177. {
  1178. pp_string (pp, sep);
  1179. sep = ", ";
  1180. pp_string (pp, "index: ");
  1181. dump_generic_node (pp, tmp, spc, flags, false);
  1182. }
  1183. tmp = TMR_STEP (node);
  1184. if (tmp)
  1185. {
  1186. pp_string (pp, sep);
  1187. sep = ", ";
  1188. pp_string (pp, "step: ");
  1189. dump_generic_node (pp, tmp, spc, flags, false);
  1190. }
  1191. tmp = TMR_OFFSET (node);
  1192. if (tmp)
  1193. {
  1194. pp_string (pp, sep);
  1195. sep = ", ";
  1196. pp_string (pp, "offset: ");
  1197. dump_generic_node (pp, tmp, spc, flags, false);
  1198. }
  1199. pp_right_bracket (pp);
  1200. }
  1201. break;
  1202. case ARRAY_TYPE:
  1203. {
  1204. tree tmp;
  1205. /* Print the innermost component type. */
  1206. for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
  1207. tmp = TREE_TYPE (tmp))
  1208. ;
  1209. dump_generic_node (pp, tmp, spc, flags, false);
  1210. /* Print the dimensions. */
  1211. for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
  1212. dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
  1213. break;
  1214. }
  1215. case RECORD_TYPE:
  1216. case UNION_TYPE:
  1217. case QUAL_UNION_TYPE:
  1218. {
  1219. unsigned int quals = TYPE_QUALS (node);
  1220. if (quals & TYPE_QUAL_ATOMIC)
  1221. pp_string (pp, "atomic ");
  1222. if (quals & TYPE_QUAL_CONST)
  1223. pp_string (pp, "const ");
  1224. if (quals & TYPE_QUAL_VOLATILE)
  1225. pp_string (pp, "volatile ");
  1226. /* Print the name of the structure. */
  1227. if (TREE_CODE (node) == RECORD_TYPE)
  1228. pp_string (pp, "struct ");
  1229. else if (TREE_CODE (node) == UNION_TYPE)
  1230. pp_string (pp, "union ");
  1231. if (TYPE_NAME (node))
  1232. dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
  1233. else if (!(flags & TDF_SLIM))
  1234. /* FIXME: If we eliminate the 'else' above and attempt
  1235. to show the fields for named types, we may get stuck
  1236. following a cycle of pointers to structs. The alleged
  1237. self-reference check in print_struct_decl will not detect
  1238. cycles involving more than one pointer or struct type. */
  1239. print_struct_decl (pp, node, spc, flags);
  1240. break;
  1241. }
  1242. case LANG_TYPE:
  1243. NIY;
  1244. break;
  1245. case INTEGER_CST:
  1246. if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
  1247. {
  1248. /* In the case of a pointer, one may want to divide by the
  1249. size of the pointed-to type. Unfortunately, this not
  1250. straightforward. The C front-end maps expressions
  1251. (int *) 5
  1252. int *p; (p + 5)
  1253. in such a way that the two INTEGER_CST nodes for "5" have
  1254. different values but identical types. In the latter
  1255. case, the 5 is multiplied by sizeof (int) in c-common.c
  1256. (pointer_int_sum) to convert it to a byte address, and
  1257. yet the type of the node is left unchanged. Argh. What
  1258. is consistent though is that the number value corresponds
  1259. to bytes (UNITS) offset.
  1260. NB: Neither of the following divisors can be trivially
  1261. used to recover the original literal:
  1262. TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
  1263. TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
  1264. pp_wide_integer (pp, TREE_INT_CST_LOW (node));
  1265. pp_string (pp, "B"); /* pseudo-unit */
  1266. }
  1267. else if (tree_fits_shwi_p (node))
  1268. pp_wide_integer (pp, tree_to_shwi (node));
  1269. else if (tree_fits_uhwi_p (node))
  1270. pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
  1271. else
  1272. {
  1273. wide_int val = node;
  1274. if (wi::neg_p (val, TYPE_SIGN (TREE_TYPE (node))))
  1275. {
  1276. pp_minus (pp);
  1277. val = -val;
  1278. }
  1279. print_hex (val, pp_buffer (pp)->digit_buffer);
  1280. pp_string (pp, pp_buffer (pp)->digit_buffer);
  1281. }
  1282. if (TREE_OVERFLOW (node))
  1283. pp_string (pp, "(OVF)");
  1284. break;
  1285. case REAL_CST:
  1286. /* Code copied from print_node. */
  1287. {
  1288. REAL_VALUE_TYPE d;
  1289. if (TREE_OVERFLOW (node))
  1290. pp_string (pp, " overflow");
  1291. #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
  1292. d = TREE_REAL_CST (node);
  1293. if (REAL_VALUE_ISINF (d))
  1294. pp_string (pp, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
  1295. else if (REAL_VALUE_ISNAN (d))
  1296. pp_string (pp, " Nan");
  1297. else
  1298. {
  1299. char string[100];
  1300. real_to_decimal (string, &d, sizeof (string), 0, 1);
  1301. pp_string (pp, string);
  1302. }
  1303. #else
  1304. {
  1305. HOST_WIDE_INT i;
  1306. unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
  1307. pp_string (pp, "0x");
  1308. for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
  1309. output_formatted_integer (pp, "%02x", *p++);
  1310. }
  1311. #endif
  1312. break;
  1313. }
  1314. case FIXED_CST:
  1315. {
  1316. char string[100];
  1317. fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
  1318. pp_string (pp, string);
  1319. break;
  1320. }
  1321. case COMPLEX_CST:
  1322. pp_string (pp, "__complex__ (");
  1323. dump_generic_node (pp, TREE_REALPART (node), spc, flags, false);
  1324. pp_string (pp, ", ");
  1325. dump_generic_node (pp, TREE_IMAGPART (node), spc, flags, false);
  1326. pp_right_paren (pp);
  1327. break;
  1328. case STRING_CST:
  1329. pp_string (pp, "\"");
  1330. pretty_print_string (pp, TREE_STRING_POINTER (node));
  1331. pp_string (pp, "\"");
  1332. break;
  1333. case VECTOR_CST:
  1334. {
  1335. unsigned i;
  1336. pp_string (pp, "{ ");
  1337. for (i = 0; i < VECTOR_CST_NELTS (node); ++i)
  1338. {
  1339. if (i != 0)
  1340. pp_string (pp, ", ");
  1341. dump_generic_node (pp, VECTOR_CST_ELT (node, i),
  1342. spc, flags, false);
  1343. }
  1344. pp_string (pp, " }");
  1345. }
  1346. break;
  1347. case FUNCTION_TYPE:
  1348. case METHOD_TYPE:
  1349. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1350. pp_space (pp);
  1351. if (TREE_CODE (node) == METHOD_TYPE)
  1352. {
  1353. if (TYPE_METHOD_BASETYPE (node))
  1354. dump_decl_name (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
  1355. flags);
  1356. else
  1357. pp_string (pp, "<null method basetype>");
  1358. pp_colon_colon (pp);
  1359. }
  1360. if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
  1361. dump_decl_name (pp, TYPE_NAME (node), flags);
  1362. else if (flags & TDF_NOUID)
  1363. pp_printf (pp, "<Txxxx>");
  1364. else
  1365. pp_printf (pp, "<T%x>", TYPE_UID (node));
  1366. dump_function_declaration (pp, node, spc, flags);
  1367. break;
  1368. case FUNCTION_DECL:
  1369. case CONST_DECL:
  1370. dump_decl_name (pp, node, flags);
  1371. break;
  1372. case LABEL_DECL:
  1373. if (DECL_NAME (node))
  1374. dump_decl_name (pp, node, flags);
  1375. else if (LABEL_DECL_UID (node) != -1)
  1376. pp_printf (pp, "<L%d>", (int) LABEL_DECL_UID (node));
  1377. else
  1378. {
  1379. if (flags & TDF_NOUID)
  1380. pp_string (pp, "<D.xxxx>");
  1381. else
  1382. pp_printf (pp, "<D.%u>", DECL_UID (node));
  1383. }
  1384. break;
  1385. case TYPE_DECL:
  1386. if (DECL_IS_BUILTIN (node))
  1387. {
  1388. /* Don't print the declaration of built-in types. */
  1389. break;
  1390. }
  1391. if (DECL_NAME (node))
  1392. dump_decl_name (pp, node, flags);
  1393. else if (TYPE_NAME (TREE_TYPE (node)) != node)
  1394. {
  1395. if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
  1396. || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
  1397. && TYPE_METHODS (TREE_TYPE (node)))
  1398. {
  1399. /* The type is a c++ class: all structures have at least
  1400. 4 methods. */
  1401. pp_string (pp, "class ");
  1402. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1403. }
  1404. else
  1405. {
  1406. pp_string (pp,
  1407. (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
  1408. ? "union" : "struct "));
  1409. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1410. }
  1411. }
  1412. else
  1413. pp_string (pp, "<anon>");
  1414. break;
  1415. case VAR_DECL:
  1416. case PARM_DECL:
  1417. case FIELD_DECL:
  1418. case DEBUG_EXPR_DECL:
  1419. case NAMESPACE_DECL:
  1420. case NAMELIST_DECL:
  1421. dump_decl_name (pp, node, flags);
  1422. break;
  1423. case RESULT_DECL:
  1424. pp_string (pp, "<retval>");
  1425. break;
  1426. case COMPONENT_REF:
  1427. op0 = TREE_OPERAND (node, 0);
  1428. str = ".";
  1429. if (op0
  1430. && (TREE_CODE (op0) == INDIRECT_REF
  1431. || (TREE_CODE (op0) == MEM_REF
  1432. && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
  1433. && integer_zerop (TREE_OPERAND (op0, 1))
  1434. /* Dump the types of INTEGER_CSTs explicitly, for we
  1435. can't infer them and MEM_ATTR caching will share
  1436. MEM_REFs with differently-typed op0s. */
  1437. && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
  1438. /* Released SSA_NAMES have no TREE_TYPE. */
  1439. && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
  1440. /* Same pointer types, but ignoring POINTER_TYPE vs.
  1441. REFERENCE_TYPE. */
  1442. && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
  1443. == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
  1444. && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
  1445. == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
  1446. && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
  1447. == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
  1448. /* Same value types ignoring qualifiers. */
  1449. && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
  1450. == TYPE_MAIN_VARIANT
  1451. (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1)))))
  1452. && MR_DEPENDENCE_CLIQUE (op0) == 0)))
  1453. {
  1454. op0 = TREE_OPERAND (op0, 0);
  1455. str = "->";
  1456. }
  1457. if (op_prio (op0) < op_prio (node))
  1458. pp_left_paren (pp);
  1459. dump_generic_node (pp, op0, spc, flags, false);
  1460. if (op_prio (op0) < op_prio (node))
  1461. pp_right_paren (pp);
  1462. pp_string (pp, str);
  1463. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1464. op0 = component_ref_field_offset (node);
  1465. if (op0 && TREE_CODE (op0) != INTEGER_CST)
  1466. {
  1467. pp_string (pp, "{off: ");
  1468. dump_generic_node (pp, op0, spc, flags, false);
  1469. pp_right_brace (pp);
  1470. }
  1471. break;
  1472. case BIT_FIELD_REF:
  1473. pp_string (pp, "BIT_FIELD_REF <");
  1474. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1475. pp_string (pp, ", ");
  1476. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1477. pp_string (pp, ", ");
  1478. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  1479. pp_greater (pp);
  1480. break;
  1481. case ARRAY_REF:
  1482. case ARRAY_RANGE_REF:
  1483. op0 = TREE_OPERAND (node, 0);
  1484. if (op_prio (op0) < op_prio (node))
  1485. pp_left_paren (pp);
  1486. dump_generic_node (pp, op0, spc, flags, false);
  1487. if (op_prio (op0) < op_prio (node))
  1488. pp_right_paren (pp);
  1489. pp_left_bracket (pp);
  1490. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1491. if (TREE_CODE (node) == ARRAY_RANGE_REF)
  1492. pp_string (pp, " ...");
  1493. pp_right_bracket (pp);
  1494. op0 = array_ref_low_bound (node);
  1495. op1 = array_ref_element_size (node);
  1496. if (!integer_zerop (op0)
  1497. || TREE_OPERAND (node, 2)
  1498. || TREE_OPERAND (node, 3))
  1499. {
  1500. pp_string (pp, "{lb: ");
  1501. dump_generic_node (pp, op0, spc, flags, false);
  1502. pp_string (pp, " sz: ");
  1503. dump_generic_node (pp, op1, spc, flags, false);
  1504. pp_right_brace (pp);
  1505. }
  1506. break;
  1507. case CONSTRUCTOR:
  1508. {
  1509. unsigned HOST_WIDE_INT ix;
  1510. tree field, val;
  1511. bool is_struct_init = false;
  1512. bool is_array_init = false;
  1513. widest_int curidx;
  1514. pp_left_brace (pp);
  1515. if (TREE_CLOBBER_P (node))
  1516. pp_string (pp, "CLOBBER");
  1517. else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
  1518. || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
  1519. is_struct_init = true;
  1520. else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
  1521. && TYPE_DOMAIN (TREE_TYPE (node))
  1522. && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
  1523. && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
  1524. == INTEGER_CST)
  1525. {
  1526. tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
  1527. is_array_init = true;
  1528. curidx = wi::to_widest (minv);
  1529. }
  1530. FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
  1531. {
  1532. if (field)
  1533. {
  1534. if (is_struct_init)
  1535. {
  1536. pp_dot (pp);
  1537. dump_generic_node (pp, field, spc, flags, false);
  1538. pp_equal (pp);
  1539. }
  1540. else if (is_array_init
  1541. && (TREE_CODE (field) != INTEGER_CST
  1542. || curidx != wi::to_widest (field)))
  1543. {
  1544. pp_left_bracket (pp);
  1545. if (TREE_CODE (field) == RANGE_EXPR)
  1546. {
  1547. dump_generic_node (pp, TREE_OPERAND (field, 0), spc,
  1548. flags, false);
  1549. pp_string (pp, " ... ");
  1550. dump_generic_node (pp, TREE_OPERAND (field, 1), spc,
  1551. flags, false);
  1552. if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
  1553. curidx = wi::to_widest (TREE_OPERAND (field, 1));
  1554. }
  1555. else
  1556. dump_generic_node (pp, field, spc, flags, false);
  1557. if (TREE_CODE (field) == INTEGER_CST)
  1558. curidx = wi::to_widest (field);
  1559. pp_string (pp, "]=");
  1560. }
  1561. }
  1562. if (is_array_init)
  1563. curidx += 1;
  1564. if (val && TREE_CODE (val) == ADDR_EXPR)
  1565. if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
  1566. val = TREE_OPERAND (val, 0);
  1567. if (val && TREE_CODE (val) == FUNCTION_DECL)
  1568. dump_decl_name (pp, val, flags);
  1569. else
  1570. dump_generic_node (pp, val, spc, flags, false);
  1571. if (ix != vec_safe_length (CONSTRUCTOR_ELTS (node)) - 1)
  1572. {
  1573. pp_comma (pp);
  1574. pp_space (pp);
  1575. }
  1576. }
  1577. pp_right_brace (pp);
  1578. }
  1579. break;
  1580. case COMPOUND_EXPR:
  1581. {
  1582. tree *tp;
  1583. if (flags & TDF_SLIM)
  1584. {
  1585. pp_string (pp, "<COMPOUND_EXPR>");
  1586. break;
  1587. }
  1588. dump_generic_node (pp, TREE_OPERAND (node, 0),
  1589. spc, flags, !(flags & TDF_SLIM));
  1590. if (flags & TDF_SLIM)
  1591. newline_and_indent (pp, spc);
  1592. else
  1593. {
  1594. pp_comma (pp);
  1595. pp_space (pp);
  1596. }
  1597. for (tp = &TREE_OPERAND (node, 1);
  1598. TREE_CODE (*tp) == COMPOUND_EXPR;
  1599. tp = &TREE_OPERAND (*tp, 1))
  1600. {
  1601. dump_generic_node (pp, TREE_OPERAND (*tp, 0),
  1602. spc, flags, !(flags & TDF_SLIM));
  1603. if (flags & TDF_SLIM)
  1604. newline_and_indent (pp, spc);
  1605. else
  1606. {
  1607. pp_comma (pp);
  1608. pp_space (pp);
  1609. }
  1610. }
  1611. dump_generic_node (pp, *tp, spc, flags, !(flags & TDF_SLIM));
  1612. }
  1613. break;
  1614. case STATEMENT_LIST:
  1615. {
  1616. tree_stmt_iterator si;
  1617. bool first = true;
  1618. if (flags & TDF_SLIM)
  1619. {
  1620. pp_string (pp, "<STATEMENT_LIST>");
  1621. break;
  1622. }
  1623. for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
  1624. {
  1625. if (!first)
  1626. newline_and_indent (pp, spc);
  1627. else
  1628. first = false;
  1629. dump_generic_node (pp, tsi_stmt (si), spc, flags, true);
  1630. }
  1631. }
  1632. break;
  1633. case MODIFY_EXPR:
  1634. case INIT_EXPR:
  1635. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags,
  1636. false);
  1637. pp_space (pp);
  1638. pp_equal (pp);
  1639. pp_space (pp);
  1640. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags,
  1641. false);
  1642. break;
  1643. case TARGET_EXPR:
  1644. pp_string (pp, "TARGET_EXPR <");
  1645. dump_generic_node (pp, TARGET_EXPR_SLOT (node), spc, flags, false);
  1646. pp_comma (pp);
  1647. pp_space (pp);
  1648. dump_generic_node (pp, TARGET_EXPR_INITIAL (node), spc, flags, false);
  1649. pp_greater (pp);
  1650. break;
  1651. case DECL_EXPR:
  1652. print_declaration (pp, DECL_EXPR_DECL (node), spc, flags);
  1653. is_stmt = false;
  1654. break;
  1655. case COND_EXPR:
  1656. if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
  1657. {
  1658. pp_string (pp, "if (");
  1659. dump_generic_node (pp, COND_EXPR_COND (node), spc, flags, false);
  1660. pp_right_paren (pp);
  1661. /* The lowered cond_exprs should always be printed in full. */
  1662. if (COND_EXPR_THEN (node)
  1663. && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
  1664. || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
  1665. && COND_EXPR_ELSE (node)
  1666. && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
  1667. || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
  1668. {
  1669. pp_space (pp);
  1670. dump_generic_node (pp, COND_EXPR_THEN (node),
  1671. 0, flags, true);
  1672. if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
  1673. {
  1674. pp_string (pp, " else ");
  1675. dump_generic_node (pp, COND_EXPR_ELSE (node),
  1676. 0, flags, true);
  1677. }
  1678. }
  1679. else if (!(flags & TDF_SLIM))
  1680. {
  1681. /* Output COND_EXPR_THEN. */
  1682. if (COND_EXPR_THEN (node))
  1683. {
  1684. newline_and_indent (pp, spc+2);
  1685. pp_left_brace (pp);
  1686. newline_and_indent (pp, spc+4);
  1687. dump_generic_node (pp, COND_EXPR_THEN (node), spc+4,
  1688. flags, true);
  1689. newline_and_indent (pp, spc+2);
  1690. pp_right_brace (pp);
  1691. }
  1692. /* Output COND_EXPR_ELSE. */
  1693. if (COND_EXPR_ELSE (node)
  1694. && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
  1695. {
  1696. newline_and_indent (pp, spc);
  1697. pp_string (pp, "else");
  1698. newline_and_indent (pp, spc+2);
  1699. pp_left_brace (pp);
  1700. newline_and_indent (pp, spc+4);
  1701. dump_generic_node (pp, COND_EXPR_ELSE (node), spc+4,
  1702. flags, true);
  1703. newline_and_indent (pp, spc+2);
  1704. pp_right_brace (pp);
  1705. }
  1706. }
  1707. is_expr = false;
  1708. }
  1709. else
  1710. {
  1711. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1712. pp_space (pp);
  1713. pp_question (pp);
  1714. pp_space (pp);
  1715. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1716. pp_space (pp);
  1717. pp_colon (pp);
  1718. pp_space (pp);
  1719. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  1720. }
  1721. break;
  1722. case BIND_EXPR:
  1723. pp_left_brace (pp);
  1724. if (!(flags & TDF_SLIM))
  1725. {
  1726. if (BIND_EXPR_VARS (node))
  1727. {
  1728. pp_newline (pp);
  1729. for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
  1730. {
  1731. print_declaration (pp, op0, spc+2, flags);
  1732. pp_newline (pp);
  1733. }
  1734. }
  1735. newline_and_indent (pp, spc+2);
  1736. dump_generic_node (pp, BIND_EXPR_BODY (node), spc+2, flags, true);
  1737. newline_and_indent (pp, spc);
  1738. pp_right_brace (pp);
  1739. }
  1740. is_expr = false;
  1741. break;
  1742. case CALL_EXPR:
  1743. if (CALL_EXPR_FN (node) != NULL_TREE)
  1744. print_call_name (pp, CALL_EXPR_FN (node), flags);
  1745. else
  1746. pp_string (pp, internal_fn_name (CALL_EXPR_IFN (node)));
  1747. /* Print parameters. */
  1748. pp_space (pp);
  1749. pp_left_paren (pp);
  1750. {
  1751. tree arg;
  1752. call_expr_arg_iterator iter;
  1753. FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
  1754. {
  1755. dump_generic_node (pp, arg, spc, flags, false);
  1756. if (more_call_expr_args_p (&iter))
  1757. {
  1758. pp_comma (pp);
  1759. pp_space (pp);
  1760. }
  1761. }
  1762. }
  1763. if (CALL_EXPR_VA_ARG_PACK (node))
  1764. {
  1765. if (call_expr_nargs (node) > 0)
  1766. {
  1767. pp_comma (pp);
  1768. pp_space (pp);
  1769. }
  1770. pp_string (pp, "__builtin_va_arg_pack ()");
  1771. }
  1772. pp_right_paren (pp);
  1773. op1 = CALL_EXPR_STATIC_CHAIN (node);
  1774. if (op1)
  1775. {
  1776. pp_string (pp, " [static-chain: ");
  1777. dump_generic_node (pp, op1, spc, flags, false);
  1778. pp_right_bracket (pp);
  1779. }
  1780. if (CALL_EXPR_RETURN_SLOT_OPT (node))
  1781. pp_string (pp, " [return slot optimization]");
  1782. if (CALL_EXPR_TAILCALL (node))
  1783. pp_string (pp, " [tail call]");
  1784. break;
  1785. case WITH_CLEANUP_EXPR:
  1786. NIY;
  1787. break;
  1788. case CLEANUP_POINT_EXPR:
  1789. pp_string (pp, "<<cleanup_point ");
  1790. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1791. pp_string (pp, ">>");
  1792. break;
  1793. case PLACEHOLDER_EXPR:
  1794. pp_string (pp, "<PLACEHOLDER_EXPR ");
  1795. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1796. pp_greater (pp);
  1797. break;
  1798. /* Binary arithmetic and logic expressions. */
  1799. case WIDEN_SUM_EXPR:
  1800. case WIDEN_MULT_EXPR:
  1801. case MULT_EXPR:
  1802. case MULT_HIGHPART_EXPR:
  1803. case PLUS_EXPR:
  1804. case POINTER_PLUS_EXPR:
  1805. case MINUS_EXPR:
  1806. case TRUNC_DIV_EXPR:
  1807. case CEIL_DIV_EXPR:
  1808. case FLOOR_DIV_EXPR:
  1809. case ROUND_DIV_EXPR:
  1810. case TRUNC_MOD_EXPR:
  1811. case CEIL_MOD_EXPR:
  1812. case FLOOR_MOD_EXPR:
  1813. case ROUND_MOD_EXPR:
  1814. case RDIV_EXPR:
  1815. case EXACT_DIV_EXPR:
  1816. case LSHIFT_EXPR:
  1817. case RSHIFT_EXPR:
  1818. case LROTATE_EXPR:
  1819. case RROTATE_EXPR:
  1820. case WIDEN_LSHIFT_EXPR:
  1821. case BIT_IOR_EXPR:
  1822. case BIT_XOR_EXPR:
  1823. case BIT_AND_EXPR:
  1824. case TRUTH_ANDIF_EXPR:
  1825. case TRUTH_ORIF_EXPR:
  1826. case TRUTH_AND_EXPR:
  1827. case TRUTH_OR_EXPR:
  1828. case TRUTH_XOR_EXPR:
  1829. case LT_EXPR:
  1830. case LE_EXPR:
  1831. case GT_EXPR:
  1832. case GE_EXPR:
  1833. case EQ_EXPR:
  1834. case NE_EXPR:
  1835. case UNLT_EXPR:
  1836. case UNLE_EXPR:
  1837. case UNGT_EXPR:
  1838. case UNGE_EXPR:
  1839. case UNEQ_EXPR:
  1840. case LTGT_EXPR:
  1841. case ORDERED_EXPR:
  1842. case UNORDERED_EXPR:
  1843. {
  1844. const char *op = op_symbol (node);
  1845. op0 = TREE_OPERAND (node, 0);
  1846. op1 = TREE_OPERAND (node, 1);
  1847. /* When the operands are expressions with less priority,
  1848. keep semantics of the tree representation. */
  1849. if (op_prio (op0) <= op_prio (node))
  1850. {
  1851. pp_left_paren (pp);
  1852. dump_generic_node (pp, op0, spc, flags, false);
  1853. pp_right_paren (pp);
  1854. }
  1855. else
  1856. dump_generic_node (pp, op0, spc, flags, false);
  1857. pp_space (pp);
  1858. pp_string (pp, op);
  1859. pp_space (pp);
  1860. /* When the operands are expressions with less priority,
  1861. keep semantics of the tree representation. */
  1862. if (op_prio (op1) <= op_prio (node))
  1863. {
  1864. pp_left_paren (pp);
  1865. dump_generic_node (pp, op1, spc, flags, false);
  1866. pp_right_paren (pp);
  1867. }
  1868. else
  1869. dump_generic_node (pp, op1, spc, flags, false);
  1870. }
  1871. break;
  1872. /* Unary arithmetic and logic expressions. */
  1873. case NEGATE_EXPR:
  1874. case BIT_NOT_EXPR:
  1875. case TRUTH_NOT_EXPR:
  1876. case ADDR_EXPR:
  1877. case PREDECREMENT_EXPR:
  1878. case PREINCREMENT_EXPR:
  1879. case INDIRECT_REF:
  1880. if (TREE_CODE (node) == ADDR_EXPR
  1881. && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
  1882. || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
  1883. ; /* Do not output '&' for strings and function pointers. */
  1884. else
  1885. pp_string (pp, op_symbol (node));
  1886. if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
  1887. {
  1888. pp_left_paren (pp);
  1889. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1890. pp_right_paren (pp);
  1891. }
  1892. else
  1893. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1894. break;
  1895. case POSTDECREMENT_EXPR:
  1896. case POSTINCREMENT_EXPR:
  1897. if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
  1898. {
  1899. pp_left_paren (pp);
  1900. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1901. pp_right_paren (pp);
  1902. }
  1903. else
  1904. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1905. pp_string (pp, op_symbol (node));
  1906. break;
  1907. case MIN_EXPR:
  1908. pp_string (pp, "MIN_EXPR <");
  1909. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1910. pp_string (pp, ", ");
  1911. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1912. pp_greater (pp);
  1913. break;
  1914. case MAX_EXPR:
  1915. pp_string (pp, "MAX_EXPR <");
  1916. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1917. pp_string (pp, ", ");
  1918. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1919. pp_greater (pp);
  1920. break;
  1921. case ABS_EXPR:
  1922. pp_string (pp, "ABS_EXPR <");
  1923. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1924. pp_greater (pp);
  1925. break;
  1926. case RANGE_EXPR:
  1927. NIY;
  1928. break;
  1929. case ADDR_SPACE_CONVERT_EXPR:
  1930. case FIXED_CONVERT_EXPR:
  1931. case FIX_TRUNC_EXPR:
  1932. case FLOAT_EXPR:
  1933. CASE_CONVERT:
  1934. type = TREE_TYPE (node);
  1935. op0 = TREE_OPERAND (node, 0);
  1936. if (type != TREE_TYPE (op0))
  1937. {
  1938. pp_left_paren (pp);
  1939. dump_generic_node (pp, type, spc, flags, false);
  1940. pp_string (pp, ") ");
  1941. }
  1942. if (op_prio (op0) < op_prio (node))
  1943. pp_left_paren (pp);
  1944. dump_generic_node (pp, op0, spc, flags, false);
  1945. if (op_prio (op0) < op_prio (node))
  1946. pp_right_paren (pp);
  1947. break;
  1948. case VIEW_CONVERT_EXPR:
  1949. pp_string (pp, "VIEW_CONVERT_EXPR<");
  1950. dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
  1951. pp_string (pp, ">(");
  1952. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1953. pp_right_paren (pp);
  1954. break;
  1955. case PAREN_EXPR:
  1956. pp_string (pp, "((");
  1957. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1958. pp_string (pp, "))");
  1959. break;
  1960. case NON_LVALUE_EXPR:
  1961. pp_string (pp, "NON_LVALUE_EXPR <");
  1962. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1963. pp_greater (pp);
  1964. break;
  1965. case SAVE_EXPR:
  1966. pp_string (pp, "SAVE_EXPR <");
  1967. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1968. pp_greater (pp);
  1969. break;
  1970. case COMPLEX_EXPR:
  1971. pp_string (pp, "COMPLEX_EXPR <");
  1972. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1973. pp_string (pp, ", ");
  1974. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  1975. pp_greater (pp);
  1976. break;
  1977. case CONJ_EXPR:
  1978. pp_string (pp, "CONJ_EXPR <");
  1979. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1980. pp_greater (pp);
  1981. break;
  1982. case REALPART_EXPR:
  1983. pp_string (pp, "REALPART_EXPR <");
  1984. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1985. pp_greater (pp);
  1986. break;
  1987. case IMAGPART_EXPR:
  1988. pp_string (pp, "IMAGPART_EXPR <");
  1989. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1990. pp_greater (pp);
  1991. break;
  1992. case VA_ARG_EXPR:
  1993. pp_string (pp, "VA_ARG_EXPR <");
  1994. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  1995. pp_greater (pp);
  1996. break;
  1997. case TRY_FINALLY_EXPR:
  1998. case TRY_CATCH_EXPR:
  1999. pp_string (pp, "try");
  2000. newline_and_indent (pp, spc+2);
  2001. pp_left_brace (pp);
  2002. newline_and_indent (pp, spc+4);
  2003. dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4, flags, true);
  2004. newline_and_indent (pp, spc+2);
  2005. pp_right_brace (pp);
  2006. newline_and_indent (pp, spc);
  2007. pp_string (pp,
  2008. (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
  2009. newline_and_indent (pp, spc+2);
  2010. pp_left_brace (pp);
  2011. newline_and_indent (pp, spc+4);
  2012. dump_generic_node (pp, TREE_OPERAND (node, 1), spc+4, flags, true);
  2013. newline_and_indent (pp, spc+2);
  2014. pp_right_brace (pp);
  2015. is_expr = false;
  2016. break;
  2017. case CATCH_EXPR:
  2018. pp_string (pp, "catch (");
  2019. dump_generic_node (pp, CATCH_TYPES (node), spc+2, flags, false);
  2020. pp_right_paren (pp);
  2021. newline_and_indent (pp, spc+2);
  2022. pp_left_brace (pp);
  2023. newline_and_indent (pp, spc+4);
  2024. dump_generic_node (pp, CATCH_BODY (node), spc+4, flags, true);
  2025. newline_and_indent (pp, spc+2);
  2026. pp_right_brace (pp);
  2027. is_expr = false;
  2028. break;
  2029. case EH_FILTER_EXPR:
  2030. pp_string (pp, "<<<eh_filter (");
  2031. dump_generic_node (pp, EH_FILTER_TYPES (node), spc+2, flags, false);
  2032. pp_string (pp, ")>>>");
  2033. newline_and_indent (pp, spc+2);
  2034. pp_left_brace (pp);
  2035. newline_and_indent (pp, spc+4);
  2036. dump_generic_node (pp, EH_FILTER_FAILURE (node), spc+4, flags, true);
  2037. newline_and_indent (pp, spc+2);
  2038. pp_right_brace (pp);
  2039. is_expr = false;
  2040. break;
  2041. case LABEL_EXPR:
  2042. op0 = TREE_OPERAND (node, 0);
  2043. /* If this is for break or continue, don't bother printing it. */
  2044. if (DECL_NAME (op0))
  2045. {
  2046. const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
  2047. if (strcmp (name, "break") == 0
  2048. || strcmp (name, "continue") == 0)
  2049. break;
  2050. }
  2051. dump_generic_node (pp, op0, spc, flags, false);
  2052. pp_colon (pp);
  2053. if (DECL_NONLOCAL (op0))
  2054. pp_string (pp, " [non-local]");
  2055. break;
  2056. case LOOP_EXPR:
  2057. pp_string (pp, "while (1)");
  2058. if (!(flags & TDF_SLIM))
  2059. {
  2060. newline_and_indent (pp, spc+2);
  2061. pp_left_brace (pp);
  2062. newline_and_indent (pp, spc+4);
  2063. dump_generic_node (pp, LOOP_EXPR_BODY (node), spc+4, flags, true);
  2064. newline_and_indent (pp, spc+2);
  2065. pp_right_brace (pp);
  2066. }
  2067. is_expr = false;
  2068. break;
  2069. case PREDICT_EXPR:
  2070. pp_string (pp, "// predicted ");
  2071. if (PREDICT_EXPR_OUTCOME (node))
  2072. pp_string (pp, "likely by ");
  2073. else
  2074. pp_string (pp, "unlikely by ");
  2075. pp_string (pp, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
  2076. pp_string (pp, " predictor.");
  2077. break;
  2078. case ANNOTATE_EXPR:
  2079. pp_string (pp, "ANNOTATE_EXPR <");
  2080. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2081. switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
  2082. {
  2083. case annot_expr_ivdep_kind:
  2084. pp_string (pp, ", ivdep");
  2085. break;
  2086. case annot_expr_no_vector_kind:
  2087. pp_string (pp, ", no-vector");
  2088. break;
  2089. case annot_expr_vector_kind:
  2090. pp_string (pp, ", vector");
  2091. break;
  2092. default:
  2093. gcc_unreachable ();
  2094. }
  2095. pp_greater (pp);
  2096. break;
  2097. case RETURN_EXPR:
  2098. pp_string (pp, "return");
  2099. op0 = TREE_OPERAND (node, 0);
  2100. if (op0)
  2101. {
  2102. pp_space (pp);
  2103. if (TREE_CODE (op0) == MODIFY_EXPR)
  2104. dump_generic_node (pp, TREE_OPERAND (op0, 1),
  2105. spc, flags, false);
  2106. else
  2107. dump_generic_node (pp, op0, spc, flags, false);
  2108. }
  2109. break;
  2110. case EXIT_EXPR:
  2111. pp_string (pp, "if (");
  2112. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2113. pp_string (pp, ") break");
  2114. break;
  2115. case SWITCH_EXPR:
  2116. pp_string (pp, "switch (");
  2117. dump_generic_node (pp, SWITCH_COND (node), spc, flags, false);
  2118. pp_right_paren (pp);
  2119. if (!(flags & TDF_SLIM))
  2120. {
  2121. newline_and_indent (pp, spc+2);
  2122. pp_left_brace (pp);
  2123. if (SWITCH_BODY (node))
  2124. {
  2125. newline_and_indent (pp, spc+4);
  2126. dump_generic_node (pp, SWITCH_BODY (node), spc+4, flags,
  2127. true);
  2128. }
  2129. else
  2130. {
  2131. tree vec = SWITCH_LABELS (node);
  2132. size_t i, n = TREE_VEC_LENGTH (vec);
  2133. for (i = 0; i < n; ++i)
  2134. {
  2135. tree elt = TREE_VEC_ELT (vec, i);
  2136. newline_and_indent (pp, spc+4);
  2137. if (elt)
  2138. {
  2139. dump_generic_node (pp, elt, spc+4, flags, false);
  2140. pp_string (pp, " goto ");
  2141. dump_generic_node (pp, CASE_LABEL (elt), spc+4,
  2142. flags, true);
  2143. pp_semicolon (pp);
  2144. }
  2145. else
  2146. pp_string (pp, "case ???: goto ???;");
  2147. }
  2148. }
  2149. newline_and_indent (pp, spc+2);
  2150. pp_right_brace (pp);
  2151. }
  2152. is_expr = false;
  2153. break;
  2154. case GOTO_EXPR:
  2155. op0 = GOTO_DESTINATION (node);
  2156. if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
  2157. {
  2158. const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
  2159. if (strcmp (name, "break") == 0
  2160. || strcmp (name, "continue") == 0)
  2161. {
  2162. pp_string (pp, name);
  2163. break;
  2164. }
  2165. }
  2166. pp_string (pp, "goto ");
  2167. dump_generic_node (pp, op0, spc, flags, false);
  2168. break;
  2169. case ASM_EXPR:
  2170. pp_string (pp, "__asm__");
  2171. if (ASM_VOLATILE_P (node))
  2172. pp_string (pp, " __volatile__");
  2173. pp_left_paren (pp);
  2174. dump_generic_node (pp, ASM_STRING (node), spc, flags, false);
  2175. pp_colon (pp);
  2176. dump_generic_node (pp, ASM_OUTPUTS (node), spc, flags, false);
  2177. pp_colon (pp);
  2178. dump_generic_node (pp, ASM_INPUTS (node), spc, flags, false);
  2179. if (ASM_CLOBBERS (node))
  2180. {
  2181. pp_colon (pp);
  2182. dump_generic_node (pp, ASM_CLOBBERS (node), spc, flags, false);
  2183. }
  2184. pp_right_paren (pp);
  2185. break;
  2186. case CASE_LABEL_EXPR:
  2187. if (CASE_LOW (node) && CASE_HIGH (node))
  2188. {
  2189. pp_string (pp, "case ");
  2190. dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
  2191. pp_string (pp, " ... ");
  2192. dump_generic_node (pp, CASE_HIGH (node), spc, flags, false);
  2193. }
  2194. else if (CASE_LOW (node))
  2195. {
  2196. pp_string (pp, "case ");
  2197. dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
  2198. }
  2199. else
  2200. pp_string (pp, "default");
  2201. pp_colon (pp);
  2202. break;
  2203. case OBJ_TYPE_REF:
  2204. pp_string (pp, "OBJ_TYPE_REF(");
  2205. dump_generic_node (pp, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
  2206. pp_semicolon (pp);
  2207. if (!(flags & TDF_SLIM) && virtual_method_call_p (node))
  2208. {
  2209. pp_string (pp, "(");
  2210. dump_generic_node (pp, obj_type_ref_class (node), spc, flags, false);
  2211. pp_string (pp, ")");
  2212. }
  2213. dump_generic_node (pp, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
  2214. pp_arrow (pp);
  2215. dump_generic_node (pp, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
  2216. pp_right_paren (pp);
  2217. break;
  2218. case SSA_NAME:
  2219. if (SSA_NAME_IDENTIFIER (node))
  2220. dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
  2221. spc, flags, false);
  2222. pp_underscore (pp);
  2223. pp_decimal_int (pp, SSA_NAME_VERSION (node));
  2224. if (SSA_NAME_IS_DEFAULT_DEF (node))
  2225. pp_string (pp, "(D)");
  2226. if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
  2227. pp_string (pp, "(ab)");
  2228. break;
  2229. case WITH_SIZE_EXPR:
  2230. pp_string (pp, "WITH_SIZE_EXPR <");
  2231. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2232. pp_string (pp, ", ");
  2233. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2234. pp_greater (pp);
  2235. break;
  2236. case ASSERT_EXPR:
  2237. pp_string (pp, "ASSERT_EXPR <");
  2238. dump_generic_node (pp, ASSERT_EXPR_VAR (node), spc, flags, false);
  2239. pp_string (pp, ", ");
  2240. dump_generic_node (pp, ASSERT_EXPR_COND (node), spc, flags, false);
  2241. pp_greater (pp);
  2242. break;
  2243. case SCEV_KNOWN:
  2244. pp_string (pp, "scev_known");
  2245. break;
  2246. case SCEV_NOT_KNOWN:
  2247. pp_string (pp, "scev_not_known");
  2248. break;
  2249. case POLYNOMIAL_CHREC:
  2250. pp_left_brace (pp);
  2251. dump_generic_node (pp, CHREC_LEFT (node), spc, flags, false);
  2252. pp_string (pp, ", +, ");
  2253. dump_generic_node (pp, CHREC_RIGHT (node), spc, flags, false);
  2254. pp_string (pp, "}_");
  2255. dump_generic_node (pp, CHREC_VAR (node), spc, flags, false);
  2256. is_stmt = false;
  2257. break;
  2258. case REALIGN_LOAD_EXPR:
  2259. pp_string (pp, "REALIGN_LOAD <");
  2260. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2261. pp_string (pp, ", ");
  2262. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2263. pp_string (pp, ", ");
  2264. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2265. pp_greater (pp);
  2266. break;
  2267. case VEC_COND_EXPR:
  2268. pp_string (pp, " VEC_COND_EXPR < ");
  2269. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2270. pp_string (pp, " , ");
  2271. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2272. pp_string (pp, " , ");
  2273. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2274. pp_string (pp, " > ");
  2275. break;
  2276. case VEC_PERM_EXPR:
  2277. pp_string (pp, " VEC_PERM_EXPR < ");
  2278. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2279. pp_string (pp, " , ");
  2280. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2281. pp_string (pp, " , ");
  2282. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2283. pp_string (pp, " > ");
  2284. break;
  2285. case DOT_PROD_EXPR:
  2286. pp_string (pp, " DOT_PROD_EXPR < ");
  2287. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2288. pp_string (pp, ", ");
  2289. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2290. pp_string (pp, ", ");
  2291. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2292. pp_string (pp, " > ");
  2293. break;
  2294. case WIDEN_MULT_PLUS_EXPR:
  2295. pp_string (pp, " WIDEN_MULT_PLUS_EXPR < ");
  2296. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2297. pp_string (pp, ", ");
  2298. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2299. pp_string (pp, ", ");
  2300. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2301. pp_string (pp, " > ");
  2302. break;
  2303. case WIDEN_MULT_MINUS_EXPR:
  2304. pp_string (pp, " WIDEN_MULT_MINUS_EXPR < ");
  2305. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2306. pp_string (pp, ", ");
  2307. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2308. pp_string (pp, ", ");
  2309. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2310. pp_string (pp, " > ");
  2311. break;
  2312. case FMA_EXPR:
  2313. pp_string (pp, " FMA_EXPR < ");
  2314. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2315. pp_string (pp, ", ");
  2316. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2317. pp_string (pp, ", ");
  2318. dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
  2319. pp_string (pp, " > ");
  2320. break;
  2321. case OACC_PARALLEL:
  2322. pp_string (pp, "#pragma acc parallel");
  2323. dump_omp_clauses (pp, OACC_PARALLEL_CLAUSES (node), spc, flags);
  2324. goto dump_omp_body;
  2325. case OACC_KERNELS:
  2326. pp_string (pp, "#pragma acc kernels");
  2327. dump_omp_clauses (pp, OACC_KERNELS_CLAUSES (node), spc, flags);
  2328. goto dump_omp_body;
  2329. case OACC_DATA:
  2330. pp_string (pp, "#pragma acc data");
  2331. dump_omp_clauses (pp, OACC_DATA_CLAUSES (node), spc, flags);
  2332. goto dump_omp_body;
  2333. case OACC_HOST_DATA:
  2334. pp_string (pp, "#pragma acc host_data");
  2335. dump_omp_clauses (pp, OACC_HOST_DATA_CLAUSES (node), spc, flags);
  2336. goto dump_omp_body;
  2337. case OACC_DECLARE:
  2338. pp_string (pp, "#pragma acc declare");
  2339. dump_omp_clauses (pp, OACC_DECLARE_CLAUSES (node), spc, flags);
  2340. break;
  2341. case OACC_UPDATE:
  2342. pp_string (pp, "#pragma acc update");
  2343. dump_omp_clauses (pp, OACC_UPDATE_CLAUSES (node), spc, flags);
  2344. break;
  2345. case OACC_ENTER_DATA:
  2346. pp_string (pp, "#pragma acc enter data");
  2347. dump_omp_clauses (pp, OACC_ENTER_DATA_CLAUSES (node), spc, flags);
  2348. break;
  2349. case OACC_EXIT_DATA:
  2350. pp_string (pp, "#pragma acc exit data");
  2351. dump_omp_clauses (pp, OACC_EXIT_DATA_CLAUSES (node), spc, flags);
  2352. break;
  2353. case OACC_CACHE:
  2354. pp_string (pp, "#pragma acc cache");
  2355. dump_omp_clauses (pp, OACC_CACHE_CLAUSES (node), spc, flags);
  2356. break;
  2357. case OMP_PARALLEL:
  2358. pp_string (pp, "#pragma omp parallel");
  2359. dump_omp_clauses (pp, OMP_PARALLEL_CLAUSES (node), spc, flags);
  2360. dump_omp_body:
  2361. if (!(flags & TDF_SLIM) && OMP_BODY (node))
  2362. {
  2363. newline_and_indent (pp, spc + 2);
  2364. pp_left_brace (pp);
  2365. newline_and_indent (pp, spc + 4);
  2366. dump_generic_node (pp, OMP_BODY (node), spc + 4, flags, false);
  2367. newline_and_indent (pp, spc + 2);
  2368. pp_right_brace (pp);
  2369. }
  2370. is_expr = false;
  2371. break;
  2372. case OMP_TASK:
  2373. pp_string (pp, "#pragma omp task");
  2374. dump_omp_clauses (pp, OMP_TASK_CLAUSES (node), spc, flags);
  2375. goto dump_omp_body;
  2376. case OMP_FOR:
  2377. pp_string (pp, "#pragma omp for");
  2378. goto dump_omp_loop;
  2379. case OMP_SIMD:
  2380. pp_string (pp, "#pragma omp simd");
  2381. goto dump_omp_loop;
  2382. case CILK_SIMD:
  2383. pp_string (pp, "#pragma simd");
  2384. goto dump_omp_loop;
  2385. case CILK_FOR:
  2386. /* This label points one line after dumping the clauses.
  2387. For _Cilk_for the clauses are dumped after the _Cilk_for (...)
  2388. parameters are printed out. */
  2389. goto dump_omp_loop_cilk_for;
  2390. case OMP_DISTRIBUTE:
  2391. pp_string (pp, "#pragma omp distribute");
  2392. goto dump_omp_loop;
  2393. case OACC_LOOP:
  2394. pp_string (pp, "#pragma acc loop");
  2395. goto dump_omp_loop;
  2396. case OMP_TEAMS:
  2397. pp_string (pp, "#pragma omp teams");
  2398. dump_omp_clauses (pp, OMP_TEAMS_CLAUSES (node), spc, flags);
  2399. goto dump_omp_body;
  2400. case OMP_TARGET_DATA:
  2401. pp_string (pp, "#pragma omp target data");
  2402. dump_omp_clauses (pp, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
  2403. goto dump_omp_body;
  2404. case OMP_TARGET:
  2405. pp_string (pp, "#pragma omp target");
  2406. dump_omp_clauses (pp, OMP_TARGET_CLAUSES (node), spc, flags);
  2407. goto dump_omp_body;
  2408. case OMP_TARGET_UPDATE:
  2409. pp_string (pp, "#pragma omp target update");
  2410. dump_omp_clauses (pp, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
  2411. is_expr = false;
  2412. break;
  2413. dump_omp_loop:
  2414. dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
  2415. dump_omp_loop_cilk_for:
  2416. if (!(flags & TDF_SLIM))
  2417. {
  2418. int i;
  2419. if (OMP_FOR_PRE_BODY (node))
  2420. {
  2421. if (TREE_CODE (node) == CILK_FOR)
  2422. pp_string (pp, " ");
  2423. else
  2424. newline_and_indent (pp, spc + 2);
  2425. pp_left_brace (pp);
  2426. spc += 4;
  2427. newline_and_indent (pp, spc);
  2428. dump_generic_node (pp, OMP_FOR_PRE_BODY (node),
  2429. spc, flags, false);
  2430. }
  2431. if (OMP_FOR_INIT (node))
  2432. {
  2433. spc -= 2;
  2434. for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
  2435. {
  2436. spc += 2;
  2437. if (TREE_CODE (node) != CILK_FOR || OMP_FOR_PRE_BODY (node))
  2438. newline_and_indent (pp, spc);
  2439. if (TREE_CODE (node) == CILK_FOR)
  2440. pp_string (pp, "_Cilk_for (");
  2441. else
  2442. pp_string (pp, "for (");
  2443. dump_generic_node (pp,
  2444. TREE_VEC_ELT (OMP_FOR_INIT (node), i),
  2445. spc, flags, false);
  2446. pp_string (pp, "; ");
  2447. dump_generic_node (pp,
  2448. TREE_VEC_ELT (OMP_FOR_COND (node), i),
  2449. spc, flags, false);
  2450. pp_string (pp, "; ");
  2451. dump_generic_node (pp,
  2452. TREE_VEC_ELT (OMP_FOR_INCR (node), i),
  2453. spc, flags, false);
  2454. pp_right_paren (pp);
  2455. }
  2456. if (TREE_CODE (node) == CILK_FOR)
  2457. dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
  2458. }
  2459. if (OMP_FOR_BODY (node))
  2460. {
  2461. newline_and_indent (pp, spc + 2);
  2462. pp_left_brace (pp);
  2463. newline_and_indent (pp, spc + 4);
  2464. dump_generic_node (pp, OMP_FOR_BODY (node), spc + 4, flags,
  2465. false);
  2466. newline_and_indent (pp, spc + 2);
  2467. pp_right_brace (pp);
  2468. }
  2469. if (OMP_FOR_INIT (node))
  2470. spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
  2471. if (OMP_FOR_PRE_BODY (node))
  2472. {
  2473. spc -= 4;
  2474. newline_and_indent (pp, spc + 2);
  2475. pp_right_brace (pp);
  2476. }
  2477. }
  2478. is_expr = false;
  2479. break;
  2480. case OMP_SECTIONS:
  2481. pp_string (pp, "#pragma omp sections");
  2482. dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
  2483. goto dump_omp_body;
  2484. case OMP_SECTION:
  2485. pp_string (pp, "#pragma omp section");
  2486. goto dump_omp_body;
  2487. case OMP_MASTER:
  2488. pp_string (pp, "#pragma omp master");
  2489. goto dump_omp_body;
  2490. case OMP_TASKGROUP:
  2491. pp_string (pp, "#pragma omp taskgroup");
  2492. goto dump_omp_body;
  2493. case OMP_ORDERED:
  2494. pp_string (pp, "#pragma omp ordered");
  2495. goto dump_omp_body;
  2496. case OMP_CRITICAL:
  2497. pp_string (pp, "#pragma omp critical");
  2498. if (OMP_CRITICAL_NAME (node))
  2499. {
  2500. pp_space (pp);
  2501. pp_left_paren (pp);
  2502. dump_generic_node (pp, OMP_CRITICAL_NAME (node), spc,
  2503. flags, false);
  2504. pp_right_paren (pp);
  2505. }
  2506. goto dump_omp_body;
  2507. case OMP_ATOMIC:
  2508. pp_string (pp, "#pragma omp atomic");
  2509. if (OMP_ATOMIC_SEQ_CST (node))
  2510. pp_string (pp, " seq_cst");
  2511. newline_and_indent (pp, spc + 2);
  2512. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2513. pp_space (pp);
  2514. pp_equal (pp);
  2515. pp_space (pp);
  2516. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2517. break;
  2518. case OMP_ATOMIC_READ:
  2519. pp_string (pp, "#pragma omp atomic read");
  2520. if (OMP_ATOMIC_SEQ_CST (node))
  2521. pp_string (pp, " seq_cst");
  2522. newline_and_indent (pp, spc + 2);
  2523. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2524. pp_space (pp);
  2525. break;
  2526. case OMP_ATOMIC_CAPTURE_OLD:
  2527. case OMP_ATOMIC_CAPTURE_NEW:
  2528. pp_string (pp, "#pragma omp atomic capture");
  2529. if (OMP_ATOMIC_SEQ_CST (node))
  2530. pp_string (pp, " seq_cst");
  2531. newline_and_indent (pp, spc + 2);
  2532. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2533. pp_space (pp);
  2534. pp_equal (pp);
  2535. pp_space (pp);
  2536. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2537. break;
  2538. case OMP_SINGLE:
  2539. pp_string (pp, "#pragma omp single");
  2540. dump_omp_clauses (pp, OMP_SINGLE_CLAUSES (node), spc, flags);
  2541. goto dump_omp_body;
  2542. case OMP_CLAUSE:
  2543. dump_omp_clause (pp, node, spc, flags);
  2544. is_expr = false;
  2545. break;
  2546. case TRANSACTION_EXPR:
  2547. if (TRANSACTION_EXPR_OUTER (node))
  2548. pp_string (pp, "__transaction_atomic [[outer]]");
  2549. else if (TRANSACTION_EXPR_RELAXED (node))
  2550. pp_string (pp, "__transaction_relaxed");
  2551. else
  2552. pp_string (pp, "__transaction_atomic");
  2553. if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
  2554. {
  2555. newline_and_indent (pp, spc);
  2556. pp_left_brace (pp);
  2557. newline_and_indent (pp, spc + 2);
  2558. dump_generic_node (pp, TRANSACTION_EXPR_BODY (node),
  2559. spc + 2, flags, false);
  2560. newline_and_indent (pp, spc);
  2561. pp_right_brace (pp);
  2562. }
  2563. is_expr = false;
  2564. break;
  2565. case REDUC_MAX_EXPR:
  2566. pp_string (pp, " REDUC_MAX_EXPR < ");
  2567. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2568. pp_string (pp, " > ");
  2569. break;
  2570. case REDUC_MIN_EXPR:
  2571. pp_string (pp, " REDUC_MIN_EXPR < ");
  2572. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2573. pp_string (pp, " > ");
  2574. break;
  2575. case REDUC_PLUS_EXPR:
  2576. pp_string (pp, " REDUC_PLUS_EXPR < ");
  2577. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2578. pp_string (pp, " > ");
  2579. break;
  2580. case VEC_WIDEN_MULT_HI_EXPR:
  2581. case VEC_WIDEN_MULT_LO_EXPR:
  2582. case VEC_WIDEN_MULT_EVEN_EXPR:
  2583. case VEC_WIDEN_MULT_ODD_EXPR:
  2584. case VEC_WIDEN_LSHIFT_HI_EXPR:
  2585. case VEC_WIDEN_LSHIFT_LO_EXPR:
  2586. pp_space (pp);
  2587. for (str = get_tree_code_name (code); *str; str++)
  2588. pp_character (pp, TOUPPER (*str));
  2589. pp_string (pp, " < ");
  2590. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2591. pp_string (pp, ", ");
  2592. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2593. pp_string (pp, " > ");
  2594. break;
  2595. case VEC_UNPACK_HI_EXPR:
  2596. pp_string (pp, " VEC_UNPACK_HI_EXPR < ");
  2597. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2598. pp_string (pp, " > ");
  2599. break;
  2600. case VEC_UNPACK_LO_EXPR:
  2601. pp_string (pp, " VEC_UNPACK_LO_EXPR < ");
  2602. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2603. pp_string (pp, " > ");
  2604. break;
  2605. case VEC_UNPACK_FLOAT_HI_EXPR:
  2606. pp_string (pp, " VEC_UNPACK_FLOAT_HI_EXPR < ");
  2607. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2608. pp_string (pp, " > ");
  2609. break;
  2610. case VEC_UNPACK_FLOAT_LO_EXPR:
  2611. pp_string (pp, " VEC_UNPACK_FLOAT_LO_EXPR < ");
  2612. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2613. pp_string (pp, " > ");
  2614. break;
  2615. case VEC_PACK_TRUNC_EXPR:
  2616. pp_string (pp, " VEC_PACK_TRUNC_EXPR < ");
  2617. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2618. pp_string (pp, ", ");
  2619. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2620. pp_string (pp, " > ");
  2621. break;
  2622. case VEC_PACK_SAT_EXPR:
  2623. pp_string (pp, " VEC_PACK_SAT_EXPR < ");
  2624. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2625. pp_string (pp, ", ");
  2626. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2627. pp_string (pp, " > ");
  2628. break;
  2629. case VEC_PACK_FIX_TRUNC_EXPR:
  2630. pp_string (pp, " VEC_PACK_FIX_TRUNC_EXPR < ");
  2631. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2632. pp_string (pp, ", ");
  2633. dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
  2634. pp_string (pp, " > ");
  2635. break;
  2636. case BLOCK:
  2637. dump_block_node (pp, node, spc, flags);
  2638. break;
  2639. case CILK_SPAWN_STMT:
  2640. pp_string (pp, "_Cilk_spawn ");
  2641. dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
  2642. break;
  2643. case CILK_SYNC_STMT:
  2644. pp_string (pp, "_Cilk_sync");
  2645. break;
  2646. default:
  2647. NIY;
  2648. }
  2649. if (is_stmt && is_expr)
  2650. pp_semicolon (pp);
  2651. return spc;
  2652. }
  2653. /* Print the declaration of a variable. */
  2654. void
  2655. print_declaration (pretty_printer *pp, tree t, int spc, int flags)
  2656. {
  2657. INDENT (spc);
  2658. if (TREE_CODE(t) == NAMELIST_DECL)
  2659. {
  2660. pp_string(pp, "namelist ");
  2661. dump_decl_name (pp, t, flags);
  2662. pp_semicolon (pp);
  2663. return;
  2664. }
  2665. if (TREE_CODE (t) == TYPE_DECL)
  2666. pp_string (pp, "typedef ");
  2667. if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
  2668. pp_string (pp, "register ");
  2669. if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
  2670. pp_string (pp, "extern ");
  2671. else if (TREE_STATIC (t))
  2672. pp_string (pp, "static ");
  2673. /* Print the type and name. */
  2674. if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
  2675. {
  2676. tree tmp;
  2677. /* Print array's type. */
  2678. tmp = TREE_TYPE (t);
  2679. while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
  2680. tmp = TREE_TYPE (tmp);
  2681. dump_generic_node (pp, TREE_TYPE (tmp), spc, flags, false);
  2682. /* Print variable's name. */
  2683. pp_space (pp);
  2684. dump_generic_node (pp, t, spc, flags, false);
  2685. /* Print the dimensions. */
  2686. tmp = TREE_TYPE (t);
  2687. while (TREE_CODE (tmp) == ARRAY_TYPE)
  2688. {
  2689. dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
  2690. tmp = TREE_TYPE (tmp);
  2691. }
  2692. }
  2693. else if (TREE_CODE (t) == FUNCTION_DECL)
  2694. {
  2695. dump_generic_node (pp, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
  2696. pp_space (pp);
  2697. dump_decl_name (pp, t, flags);
  2698. dump_function_declaration (pp, TREE_TYPE (t), spc, flags);
  2699. }
  2700. else
  2701. {
  2702. /* Print type declaration. */
  2703. dump_generic_node (pp, TREE_TYPE (t), spc, flags, false);
  2704. /* Print variable's name. */
  2705. pp_space (pp);
  2706. dump_generic_node (pp, t, spc, flags, false);
  2707. }
  2708. if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
  2709. {
  2710. pp_string (pp, " __asm__ ");
  2711. pp_left_paren (pp);
  2712. dump_generic_node (pp, DECL_ASSEMBLER_NAME (t), spc, flags, false);
  2713. pp_right_paren (pp);
  2714. }
  2715. /* The initial value of a function serves to determine whether the function
  2716. is declared or defined. So the following does not apply to function
  2717. nodes. */
  2718. if (TREE_CODE (t) != FUNCTION_DECL)
  2719. {
  2720. /* Print the initial value. */
  2721. if (DECL_INITIAL (t))
  2722. {
  2723. pp_space (pp);
  2724. pp_equal (pp);
  2725. pp_space (pp);
  2726. dump_generic_node (pp, DECL_INITIAL (t), spc, flags, false);
  2727. }
  2728. }
  2729. if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
  2730. {
  2731. pp_string (pp, " [value-expr: ");
  2732. dump_generic_node (pp, DECL_VALUE_EXPR (t), spc, flags, false);
  2733. pp_right_bracket (pp);
  2734. }
  2735. pp_semicolon (pp);
  2736. }
  2737. /* Prints a structure: name, fields, and methods.
  2738. FIXME: Still incomplete. */
  2739. static void
  2740. print_struct_decl (pretty_printer *pp, const_tree node, int spc, int flags)
  2741. {
  2742. /* Print the name of the structure. */
  2743. if (TYPE_NAME (node))
  2744. {
  2745. INDENT (spc);
  2746. if (TREE_CODE (node) == RECORD_TYPE)
  2747. pp_string (pp, "struct ");
  2748. else if ((TREE_CODE (node) == UNION_TYPE
  2749. || TREE_CODE (node) == QUAL_UNION_TYPE))
  2750. pp_string (pp, "union ");
  2751. dump_generic_node (pp, TYPE_NAME (node), spc, 0, false);
  2752. }
  2753. /* Print the contents of the structure. */
  2754. pp_newline (pp);
  2755. INDENT (spc);
  2756. pp_left_brace (pp);
  2757. pp_newline (pp);
  2758. /* Print the fields of the structure. */
  2759. {
  2760. tree tmp;
  2761. tmp = TYPE_FIELDS (node);
  2762. while (tmp)
  2763. {
  2764. /* Avoid to print recursively the structure. */
  2765. /* FIXME : Not implemented correctly...,
  2766. what about the case when we have a cycle in the contain graph? ...
  2767. Maybe this could be solved by looking at the scope in which the
  2768. structure was declared. */
  2769. if (TREE_TYPE (tmp) != node
  2770. && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
  2771. || TREE_TYPE (TREE_TYPE (tmp)) != node))
  2772. {
  2773. print_declaration (pp, tmp, spc+2, flags);
  2774. pp_newline (pp);
  2775. }
  2776. tmp = DECL_CHAIN (tmp);
  2777. }
  2778. }
  2779. INDENT (spc);
  2780. pp_right_brace (pp);
  2781. }
  2782. /* Return the priority of the operator CODE.
  2783. From lowest to highest precedence with either left-to-right (L-R)
  2784. or right-to-left (R-L) associativity]:
  2785. 1 [L-R] ,
  2786. 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
  2787. 3 [R-L] ?:
  2788. 4 [L-R] ||
  2789. 5 [L-R] &&
  2790. 6 [L-R] |
  2791. 7 [L-R] ^
  2792. 8 [L-R] &
  2793. 9 [L-R] == !=
  2794. 10 [L-R] < <= > >=
  2795. 11 [L-R] << >>
  2796. 12 [L-R] + -
  2797. 13 [L-R] * / %
  2798. 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
  2799. 15 [L-R] fn() [] -> .
  2800. unary +, - and * have higher precedence than the corresponding binary
  2801. operators. */
  2802. int
  2803. op_code_prio (enum tree_code code)
  2804. {
  2805. switch (code)
  2806. {
  2807. case TREE_LIST:
  2808. case COMPOUND_EXPR:
  2809. case BIND_EXPR:
  2810. return 1;
  2811. case MODIFY_EXPR:
  2812. case INIT_EXPR:
  2813. return 2;
  2814. case COND_EXPR:
  2815. return 3;
  2816. case TRUTH_OR_EXPR:
  2817. case TRUTH_ORIF_EXPR:
  2818. return 4;
  2819. case TRUTH_AND_EXPR:
  2820. case TRUTH_ANDIF_EXPR:
  2821. return 5;
  2822. case BIT_IOR_EXPR:
  2823. return 6;
  2824. case BIT_XOR_EXPR:
  2825. case TRUTH_XOR_EXPR:
  2826. return 7;
  2827. case BIT_AND_EXPR:
  2828. return 8;
  2829. case EQ_EXPR:
  2830. case NE_EXPR:
  2831. return 9;
  2832. case UNLT_EXPR:
  2833. case UNLE_EXPR:
  2834. case UNGT_EXPR:
  2835. case UNGE_EXPR:
  2836. case UNEQ_EXPR:
  2837. case LTGT_EXPR:
  2838. case ORDERED_EXPR:
  2839. case UNORDERED_EXPR:
  2840. case LT_EXPR:
  2841. case LE_EXPR:
  2842. case GT_EXPR:
  2843. case GE_EXPR:
  2844. return 10;
  2845. case LSHIFT_EXPR:
  2846. case RSHIFT_EXPR:
  2847. case LROTATE_EXPR:
  2848. case RROTATE_EXPR:
  2849. case VEC_WIDEN_LSHIFT_HI_EXPR:
  2850. case VEC_WIDEN_LSHIFT_LO_EXPR:
  2851. case WIDEN_LSHIFT_EXPR:
  2852. return 11;
  2853. case WIDEN_SUM_EXPR:
  2854. case PLUS_EXPR:
  2855. case POINTER_PLUS_EXPR:
  2856. case MINUS_EXPR:
  2857. return 12;
  2858. case VEC_WIDEN_MULT_HI_EXPR:
  2859. case VEC_WIDEN_MULT_LO_EXPR:
  2860. case WIDEN_MULT_EXPR:
  2861. case DOT_PROD_EXPR:
  2862. case WIDEN_MULT_PLUS_EXPR:
  2863. case WIDEN_MULT_MINUS_EXPR:
  2864. case MULT_EXPR:
  2865. case MULT_HIGHPART_EXPR:
  2866. case TRUNC_DIV_EXPR:
  2867. case CEIL_DIV_EXPR:
  2868. case FLOOR_DIV_EXPR:
  2869. case ROUND_DIV_EXPR:
  2870. case RDIV_EXPR:
  2871. case EXACT_DIV_EXPR:
  2872. case TRUNC_MOD_EXPR:
  2873. case CEIL_MOD_EXPR:
  2874. case FLOOR_MOD_EXPR:
  2875. case ROUND_MOD_EXPR:
  2876. case FMA_EXPR:
  2877. return 13;
  2878. case TRUTH_NOT_EXPR:
  2879. case BIT_NOT_EXPR:
  2880. case POSTINCREMENT_EXPR:
  2881. case POSTDECREMENT_EXPR:
  2882. case PREINCREMENT_EXPR:
  2883. case PREDECREMENT_EXPR:
  2884. case NEGATE_EXPR:
  2885. case INDIRECT_REF:
  2886. case ADDR_EXPR:
  2887. case FLOAT_EXPR:
  2888. CASE_CONVERT:
  2889. case FIX_TRUNC_EXPR:
  2890. case TARGET_EXPR:
  2891. return 14;
  2892. case CALL_EXPR:
  2893. case ARRAY_REF:
  2894. case ARRAY_RANGE_REF:
  2895. case COMPONENT_REF:
  2896. return 15;
  2897. /* Special expressions. */
  2898. case MIN_EXPR:
  2899. case MAX_EXPR:
  2900. case ABS_EXPR:
  2901. case REALPART_EXPR:
  2902. case IMAGPART_EXPR:
  2903. case REDUC_MAX_EXPR:
  2904. case REDUC_MIN_EXPR:
  2905. case REDUC_PLUS_EXPR:
  2906. case VEC_UNPACK_HI_EXPR:
  2907. case VEC_UNPACK_LO_EXPR:
  2908. case VEC_UNPACK_FLOAT_HI_EXPR:
  2909. case VEC_UNPACK_FLOAT_LO_EXPR:
  2910. case VEC_PACK_TRUNC_EXPR:
  2911. case VEC_PACK_SAT_EXPR:
  2912. return 16;
  2913. default:
  2914. /* Return an arbitrarily high precedence to avoid surrounding single
  2915. VAR_DECLs in ()s. */
  2916. return 9999;
  2917. }
  2918. }
  2919. /* Return the priority of the operator OP. */
  2920. int
  2921. op_prio (const_tree op)
  2922. {
  2923. enum tree_code code;
  2924. if (op == NULL)
  2925. return 9999;
  2926. code = TREE_CODE (op);
  2927. if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
  2928. return op_prio (TREE_OPERAND (op, 0));
  2929. return op_code_prio (code);
  2930. }
  2931. /* Return the symbol associated with operator CODE. */
  2932. const char *
  2933. op_symbol_code (enum tree_code code)
  2934. {
  2935. switch (code)
  2936. {
  2937. case MODIFY_EXPR:
  2938. return "=";
  2939. case TRUTH_OR_EXPR:
  2940. case TRUTH_ORIF_EXPR:
  2941. return "||";
  2942. case TRUTH_AND_EXPR:
  2943. case TRUTH_ANDIF_EXPR:
  2944. return "&&";
  2945. case BIT_IOR_EXPR:
  2946. return "|";
  2947. case TRUTH_XOR_EXPR:
  2948. case BIT_XOR_EXPR:
  2949. return "^";
  2950. case ADDR_EXPR:
  2951. case BIT_AND_EXPR:
  2952. return "&";
  2953. case ORDERED_EXPR:
  2954. return "ord";
  2955. case UNORDERED_EXPR:
  2956. return "unord";
  2957. case EQ_EXPR:
  2958. return "==";
  2959. case UNEQ_EXPR:
  2960. return "u==";
  2961. case NE_EXPR:
  2962. return "!=";
  2963. case LT_EXPR:
  2964. return "<";
  2965. case UNLT_EXPR:
  2966. return "u<";
  2967. case LE_EXPR:
  2968. return "<=";
  2969. case UNLE_EXPR:
  2970. return "u<=";
  2971. case GT_EXPR:
  2972. return ">";
  2973. case UNGT_EXPR:
  2974. return "u>";
  2975. case GE_EXPR:
  2976. return ">=";
  2977. case UNGE_EXPR:
  2978. return "u>=";
  2979. case LTGT_EXPR:
  2980. return "<>";
  2981. case LSHIFT_EXPR:
  2982. return "<<";
  2983. case RSHIFT_EXPR:
  2984. return ">>";
  2985. case LROTATE_EXPR:
  2986. return "r<<";
  2987. case RROTATE_EXPR:
  2988. return "r>>";
  2989. case WIDEN_LSHIFT_EXPR:
  2990. return "w<<";
  2991. case POINTER_PLUS_EXPR:
  2992. return "+";
  2993. case PLUS_EXPR:
  2994. return "+";
  2995. case REDUC_PLUS_EXPR:
  2996. return "r+";
  2997. case WIDEN_SUM_EXPR:
  2998. return "w+";
  2999. case WIDEN_MULT_EXPR:
  3000. return "w*";
  3001. case MULT_HIGHPART_EXPR:
  3002. return "h*";
  3003. case NEGATE_EXPR:
  3004. case MINUS_EXPR:
  3005. return "-";
  3006. case BIT_NOT_EXPR:
  3007. return "~";
  3008. case TRUTH_NOT_EXPR:
  3009. return "!";
  3010. case MULT_EXPR:
  3011. case INDIRECT_REF:
  3012. return "*";
  3013. case TRUNC_DIV_EXPR:
  3014. case RDIV_EXPR:
  3015. return "/";
  3016. case CEIL_DIV_EXPR:
  3017. return "/[cl]";
  3018. case FLOOR_DIV_EXPR:
  3019. return "/[fl]";
  3020. case ROUND_DIV_EXPR:
  3021. return "/[rd]";
  3022. case EXACT_DIV_EXPR:
  3023. return "/[ex]";
  3024. case TRUNC_MOD_EXPR:
  3025. return "%";
  3026. case CEIL_MOD_EXPR:
  3027. return "%[cl]";
  3028. case FLOOR_MOD_EXPR:
  3029. return "%[fl]";
  3030. case ROUND_MOD_EXPR:
  3031. return "%[rd]";
  3032. case PREDECREMENT_EXPR:
  3033. return " --";
  3034. case PREINCREMENT_EXPR:
  3035. return " ++";
  3036. case POSTDECREMENT_EXPR:
  3037. return "-- ";
  3038. case POSTINCREMENT_EXPR:
  3039. return "++ ";
  3040. case MAX_EXPR:
  3041. return "max";
  3042. case MIN_EXPR:
  3043. return "min";
  3044. default:
  3045. return "<<< ??? >>>";
  3046. }
  3047. }
  3048. /* Return the symbol associated with operator OP. */
  3049. static const char *
  3050. op_symbol (const_tree op)
  3051. {
  3052. return op_symbol_code (TREE_CODE (op));
  3053. }
  3054. /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
  3055. the gimple_call_fn of a GIMPLE_CALL. */
  3056. void
  3057. print_call_name (pretty_printer *pp, tree node, int flags)
  3058. {
  3059. tree op0 = node;
  3060. if (TREE_CODE (op0) == NON_LVALUE_EXPR)
  3061. op0 = TREE_OPERAND (op0, 0);
  3062. again:
  3063. switch (TREE_CODE (op0))
  3064. {
  3065. case VAR_DECL:
  3066. case PARM_DECL:
  3067. case FUNCTION_DECL:
  3068. dump_function_name (pp, op0, flags);
  3069. break;
  3070. case ADDR_EXPR:
  3071. case INDIRECT_REF:
  3072. CASE_CONVERT:
  3073. op0 = TREE_OPERAND (op0, 0);
  3074. goto again;
  3075. case COND_EXPR:
  3076. pp_left_paren (pp);
  3077. dump_generic_node (pp, TREE_OPERAND (op0, 0), 0, flags, false);
  3078. pp_string (pp, ") ? ");
  3079. dump_generic_node (pp, TREE_OPERAND (op0, 1), 0, flags, false);
  3080. pp_string (pp, " : ");
  3081. dump_generic_node (pp, TREE_OPERAND (op0, 2), 0, flags, false);
  3082. break;
  3083. case ARRAY_REF:
  3084. if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
  3085. dump_function_name (pp, TREE_OPERAND (op0, 0), flags);
  3086. else
  3087. dump_generic_node (pp, op0, 0, flags, false);
  3088. break;
  3089. case MEM_REF:
  3090. if (integer_zerop (TREE_OPERAND (op0, 1)))
  3091. {
  3092. op0 = TREE_OPERAND (op0, 0);
  3093. goto again;
  3094. }
  3095. /* Fallthru. */
  3096. case COMPONENT_REF:
  3097. case SSA_NAME:
  3098. case OBJ_TYPE_REF:
  3099. dump_generic_node (pp, op0, 0, flags, false);
  3100. break;
  3101. default:
  3102. NIY;
  3103. }
  3104. }
  3105. /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
  3106. static void
  3107. pretty_print_string (pretty_printer *pp, const char *str)
  3108. {
  3109. if (str == NULL)
  3110. return;
  3111. while (*str)
  3112. {
  3113. switch (str[0])
  3114. {
  3115. case '\b':
  3116. pp_string (pp, "\\b");
  3117. break;
  3118. case '\f':
  3119. pp_string (pp, "\\f");
  3120. break;
  3121. case '\n':
  3122. pp_string (pp, "\\n");
  3123. break;
  3124. case '\r':
  3125. pp_string (pp, "\\r");
  3126. break;
  3127. case '\t':
  3128. pp_string (pp, "\\t");
  3129. break;
  3130. case '\v':
  3131. pp_string (pp, "\\v");
  3132. break;
  3133. case '\\':
  3134. pp_string (pp, "\\\\");
  3135. break;
  3136. case '\"':
  3137. pp_string (pp, "\\\"");
  3138. break;
  3139. case '\'':
  3140. pp_string (pp, "\\'");
  3141. break;
  3142. /* No need to handle \0; the loop terminates on \0. */
  3143. case '\1':
  3144. pp_string (pp, "\\1");
  3145. break;
  3146. case '\2':
  3147. pp_string (pp, "\\2");
  3148. break;
  3149. case '\3':
  3150. pp_string (pp, "\\3");
  3151. break;
  3152. case '\4':
  3153. pp_string (pp, "\\4");
  3154. break;
  3155. case '\5':
  3156. pp_string (pp, "\\5");
  3157. break;
  3158. case '\6':
  3159. pp_string (pp, "\\6");
  3160. break;
  3161. case '\7':
  3162. pp_string (pp, "\\7");
  3163. break;
  3164. default:
  3165. pp_character (pp, str[0]);
  3166. break;
  3167. }
  3168. str++;
  3169. }
  3170. }
  3171. static void
  3172. maybe_init_pretty_print (FILE *file)
  3173. {
  3174. if (!tree_pp)
  3175. {
  3176. tree_pp = new pretty_printer ();
  3177. pp_needs_newline (tree_pp) = true;
  3178. pp_translate_identifiers (tree_pp) = false;
  3179. }
  3180. tree_pp->buffer->stream = file;
  3181. }
  3182. static void
  3183. newline_and_indent (pretty_printer *pp, int spc)
  3184. {
  3185. pp_newline (pp);
  3186. INDENT (spc);
  3187. }
  3188. /* Handle a %K format for TEXT. Separate from default_tree_printer so
  3189. it can also be used in front ends.
  3190. %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
  3191. */
  3192. void
  3193. percent_K_format (text_info *text)
  3194. {
  3195. tree t = va_arg (*text->args_ptr, tree), block;
  3196. gcc_assert (text->locus != NULL);
  3197. *text->locus = EXPR_LOCATION (t);
  3198. gcc_assert (pp_ti_abstract_origin (text) != NULL);
  3199. block = TREE_BLOCK (t);
  3200. *pp_ti_abstract_origin (text) = NULL;
  3201. if (in_lto_p)
  3202. {
  3203. /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
  3204. representing the outermost block of an inlined function.
  3205. So walk the BLOCK tree until we hit such a scope. */
  3206. while (block
  3207. && TREE_CODE (block) == BLOCK)
  3208. {
  3209. if (inlined_function_outer_scope_p (block))
  3210. {
  3211. *pp_ti_abstract_origin (text) = block;
  3212. break;
  3213. }
  3214. block = BLOCK_SUPERCONTEXT (block);
  3215. }
  3216. return;
  3217. }
  3218. while (block
  3219. && TREE_CODE (block) == BLOCK
  3220. && BLOCK_ABSTRACT_ORIGIN (block))
  3221. {
  3222. tree ao = BLOCK_ABSTRACT_ORIGIN (block);
  3223. while (TREE_CODE (ao) == BLOCK
  3224. && BLOCK_ABSTRACT_ORIGIN (ao)
  3225. && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
  3226. ao = BLOCK_ABSTRACT_ORIGIN (ao);
  3227. if (TREE_CODE (ao) == FUNCTION_DECL)
  3228. {
  3229. *pp_ti_abstract_origin (text) = block;
  3230. break;
  3231. }
  3232. block = BLOCK_SUPERCONTEXT (block);
  3233. }
  3234. }
  3235. /* Print the identifier ID to PRETTY-PRINTER. */
  3236. void
  3237. pp_tree_identifier (pretty_printer *pp, tree id)
  3238. {
  3239. if (pp_translate_identifiers (pp))
  3240. {
  3241. const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
  3242. pp_append_text (pp, text, text + strlen (text));
  3243. }
  3244. else
  3245. pp_append_text (pp, IDENTIFIER_POINTER (id),
  3246. IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
  3247. }
  3248. /* A helper function that is used to dump function information before the
  3249. function dump. */
  3250. void
  3251. dump_function_header (FILE *dump_file, tree fdecl, int flags)
  3252. {
  3253. const char *dname, *aname;
  3254. struct cgraph_node *node = cgraph_node::get (fdecl);
  3255. struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
  3256. dname = lang_hooks.decl_printable_name (fdecl, 2);
  3257. if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
  3258. aname = (IDENTIFIER_POINTER
  3259. (DECL_ASSEMBLER_NAME (fdecl)));
  3260. else
  3261. aname = "<unset-asm-name>";
  3262. fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
  3263. dname, aname, fun->funcdef_no);
  3264. if (!(flags & TDF_NOUID))
  3265. fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
  3266. if (node)
  3267. {
  3268. fprintf (dump_file, ", cgraph_uid=%d", node->uid);
  3269. fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
  3270. node->frequency == NODE_FREQUENCY_HOT
  3271. ? " (hot)"
  3272. : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
  3273. ? " (unlikely executed)"
  3274. : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
  3275. ? " (executed once)"
  3276. : "");
  3277. }
  3278. else
  3279. fprintf (dump_file, ")\n\n");
  3280. }
  3281. /* Dump double_int D to pretty_printer PP. UNS is true
  3282. if D is unsigned and false otherwise. */
  3283. void
  3284. pp_double_int (pretty_printer *pp, double_int d, bool uns)
  3285. {
  3286. if (d.fits_shwi ())
  3287. pp_wide_integer (pp, d.low);
  3288. else if (d.fits_uhwi ())
  3289. pp_unsigned_wide_integer (pp, d.low);
  3290. else
  3291. {
  3292. unsigned HOST_WIDE_INT low = d.low;
  3293. HOST_WIDE_INT high = d.high;
  3294. if (!uns && d.is_negative ())
  3295. {
  3296. pp_minus (pp);
  3297. high = ~high + !low;
  3298. low = -low;
  3299. }
  3300. /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
  3301. systems? */
  3302. sprintf (pp_buffer (pp)->digit_buffer,
  3303. HOST_WIDE_INT_PRINT_DOUBLE_HEX,
  3304. (unsigned HOST_WIDE_INT) high, low);
  3305. pp_string (pp, pp_buffer (pp)->digit_buffer);
  3306. }
  3307. }