|  | " Syntax highlighting rules for GIMPLE dump files (for Vim). | 
|  | " | 
|  | " Copyright (C) 2015 Free Software Foundation, Inc. | 
|  | " | 
|  | " This script is free software; you can redistribute it and/or modify | 
|  | " it under the terms of the GNU General Public License as published by | 
|  | " the Free Software Foundation; either version 3, or (at your option) | 
|  | " any later version | 
|  | " | 
|  | " This Vim script highlights syntax in debug dumps containing GIMPLE | 
|  | " intermediate representation.  Such dumps are produced by GCC when | 
|  | " it is invoked with -fdump-tree-* and/or -fdump-ipa-* switches.  Tested | 
|  | " in Vim 7.4 (but should also work with earlier versions). | 
|  |  | 
|  |  | 
|  | " Do not continue, if syntax is already enabled in current buffer. | 
|  | if exists("b:current_syntax") | 
|  | finish | 
|  | endif | 
|  |  | 
|  | " If this variable is set to true, "Unknown tree" in -fdump-tree-original will | 
|  | " be highlighted as an error. | 
|  | let s:unknown_tree_is_error=0 | 
|  |  | 
|  | " Comments for Phi nodes, value ranges, use/def-chains, etc. | 
|  | syn match   gimpleAnnotation    "\v#.*$" | 
|  | \ contains=gimpleAnnotationOp, gimpleAnnotationMark, | 
|  | \ gimpleNumber, gimpleLineNo | 
|  | syn match   gimpleAnnotationMark    "#" contained | 
|  | syn keyword gimpleAnnotationOp    PHI VUSE VDEF RANGE PT USE CLB | 
|  | \ ALIGN MISALIGN NONZERO contained | 
|  |  | 
|  | " General-purpose comments. | 
|  | syn match   gimpleComment       ";;.*$" | 
|  |  | 
|  | " Types - mostly borrowed from original Vim syntax file for C | 
|  | syn keyword     gimpleType  int long short char void | 
|  | \ signed unsigned float double | 
|  | \ size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t | 
|  | \ clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t | 
|  | \ mbstate_t wctrans_t wint_t wctype_t | 
|  | \ _Bool bool _Complex complex _Imaginary imaginary | 
|  | \ int8_t int16_t int32_t int64_t | 
|  | \ uint8_t uint16_t uint32_t uint64_t | 
|  | \ int_least8_t int_least16_t int_least32_t int_least64_t | 
|  | \ uint_least8_t uint_least16_t uint_least32_t uint_least64_t | 
|  | \ int_fast8_t int_fast16_t int_fast32_t int_fast64_t | 
|  | \ uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t | 
|  | \ intptr_t uintptr_t | 
|  | \ intmax_t uintmax_t | 
|  | \ __label__ __complex__ __volatile__ | 
|  | \ char16_t char32_t sizetype __vtbl_ptr_type | 
|  |  | 
|  | " C/C++-like control structures | 
|  | syn keyword gimpleStatement     goto return | 
|  | syn keyword gimpleConditional   if else | 
|  | syn keyword gimpleLoop          while | 
|  | syn keyword gimpleException     try catch finally | 
|  |  | 
|  | " Special 'values' | 
|  | syn match   gimpleConstant      "{CLOBBER}" | 
|  | syn match   gimpleConstant      "{ref-all}" | 
|  | syn match   gimpleConstant      "{v}" | 
|  |  | 
|  | " Blocks | 
|  | syn region  gimpleBlock         start="{" end="}" transparent fold | 
|  |  | 
|  | " String literals | 
|  | syn region  gimpleString        start=/\v"/ skip=/\v\\./ end=/\v"/ | 
|  |  | 
|  | " GENERIC AST nodes | 
|  | syn keyword gimpleASTNode       BIT_FIELD_REF TARGET_EXPR expr_stmt | 
|  | \ NON_LVALUE_EXPR | 
|  | \ must_not_throw_expr eh_spec_block eh_filter | 
|  | \ eh_must_not_throw aggr_init_expr cleanup_point | 
|  |  | 
|  | if s:unknown_tree_is_error | 
|  | syn match   gimpleUnknownTree   "\vUnknown tree: \w+" | 
|  | end | 
|  |  | 
|  | " Ignore probability of edges and basic blocks | 
|  | "  <bb 2> [70.00%]: | 
|  | syn match   gimpleFrequency     " \[\d*\.\d*%\]" | 
|  |  | 
|  | " Ignore basic block with a count | 
|  | "  <bb 10> [local count: 118111601]: | 
|  | syn match   gimpleBBCount       "\v\[(local )?count: \d+\]" | 
|  |  | 
|  | " Numbers | 
|  | syn match   gimpleNumber        "\v([^.a-zA-Z0-9_])\zs-?\d+B?" | 
|  | syn match   gimpleFloat         "\v\W\zs-?\d*\.\d+(e\+\d+)?" | 
|  |  | 
|  | " Basic block label | 
|  | " <bb 123>: | 
|  | syn match   gimpleLabel         "\v^\s*\zs\<bb \d+\>" | 
|  | " <D.1234>: | 
|  | " <L1>: | 
|  | syn match   gimpleLabel         "\v^\s*\zs\<[DL]\.?\d+\>" | 
|  | " label: - user-defined label | 
|  | " bb1L.1: | 
|  | syn match   gimpleLabel         "\v^\s*[a-zA-Z0-9._]+\ze:\s*$" | 
|  |  | 
|  | " Match label after goto to suppress highlighting of numbers inside | 
|  | syn match   gimpleGotoLabel     "\v<bb \d+\>[^:]" | 
|  |  | 
|  | " Line numbers, generated with -fdump-tree-*-lineno | 
|  | syn match   gimpleLineNo        "\v\[[^\]]+:\d+:\d+\]" | 
|  |  | 
|  | " DEBUG statements | 
|  | syn match   gimpleDebug         "\v# DEBUG.*" | 
|  |  | 
|  | " GIMPLE predict statement | 
|  | syn match   gimplePrediction    "\v\/\/ predicted.*" | 
|  |  | 
|  |  | 
|  | " Misc C/C++-like keywords | 
|  | syn keyword gimpleStructure     struct union enum typedef class | 
|  | syn keyword gimpleStorageClass  static register auto volatile extern const | 
|  | \ template inline __attribute__ _Alignas alignas _Atomic | 
|  | \ _Thread_local thread_local _Alignof alignof sizeof | 
|  |  | 
|  | hi def link gimpleType          Type | 
|  | hi def link gimpleNumber        Number | 
|  | hi def link gimpleFloat         Float | 
|  | hi def link gimpleConstant      Constant | 
|  | hi def link gimpleStructure     Structure | 
|  | hi def link gimpleStorageClass  StorageClass | 
|  | hi def link gimpleOperator      Operator | 
|  | hi def link gimpleASTNode       Operator | 
|  | hi def link gimpleStatement     Statement | 
|  | hi def link gimpleConditional   Conditional | 
|  | hi def link gimpleLoop          Repeat | 
|  | hi def link gimpleException     Exception | 
|  | hi def link gimpleComment       Comment | 
|  | hi def link gimpleLineNo        Comment | 
|  | hi def link gimpleLabel         Label | 
|  | hi def link gimpleAnnotationOp  Debug | 
|  | hi def link gimpleAnnotationMark Debug | 
|  | hi def link gimpleString        String | 
|  | hi def link gimpleUnknownTree   Error | 
|  | hi def link gimpleDebug         Debug | 
|  | hi def link gimplePrediction    Debug | 
|  | hi def link gimpleFrequency     Debug | 
|  | hi def link gimpleBBCount       Debug | 
|  |  | 
|  | let b:current_syntax = "gimple" |