1 /* Map (unsigned int) keys to (source file, line, column) triples. 2 Copyright (C) 2001-2019 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify it 5 under the terms of the GNU General Public License as published by the 6 Free Software Foundation; either version 3, or (at your option) any 7 later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; see the file COPYING3. If not see 16 <http://www.gnu.org/licenses/>. 17 18 In other words, you are welcome to use, share and improve this program. 19 You are forbidden to forbid anyone else to use, share and improve 20 what you give them. Help stamp out software-hoarding! */ 21 22 #ifndef LIBCPP_LINE_MAP_H 23 #define LIBCPP_LINE_MAP_H 24 25 #ifndef GTY 26 #define GTY(x) /* nothing */ 27 #endif 28 29 /* Both gcc and emacs number source *lines* starting at 1, but 30 they have differing conventions for *columns*. 31 32 GCC uses a 1-based convention for source columns, 33 whereas Emacs's M-x column-number-mode uses a 0-based convention. 34 35 For example, an error in the initial, left-hand 36 column of source line 3 is reported by GCC as: 37 38 some-file.c:3:1: error: ...etc... 39 40 On navigating to the location of that error in Emacs 41 (e.g. via "next-error"), 42 the locus is reported in the Mode Line 43 (assuming M-x column-number-mode) as: 44 45 some-file.c 10% (3, 0) 46 47 i.e. "3:1:" in GCC corresponds to "(3, 0)" in Emacs. */ 48 49 /* The type of line numbers. */ 50 typedef unsigned int linenum_type; 51 52 /* A type for doing arithmetic on line numbers. */ 53 typedef long long linenum_arith_t; 54 55 /* A function for for use by qsort for comparing line numbers. */ 56 57 inline int compare (linenum_type lhs, linenum_type rhs) 58 { 59 /* Avoid truncation issues by using linenum_arith_t for the comparison, 60 and only consider the sign of the result. */ 61 linenum_arith_t diff = (linenum_arith_t)lhs - (linenum_arith_t)rhs; 62 if (diff) 63 return diff > 0 ? 1 : -1; 64 return 0; 65 } 66 67 /* Reason for creating a new line map with linemap_add. */ 68 enum lc_reason 69 { 70 LC_ENTER = 0, /* Begin #include. */ 71 LC_LEAVE, /* Return to including file. */ 72 LC_RENAME, /* Other reason for name change. */ 73 LC_RENAME_VERBATIM, /* Likewise, but "" != stdin. */ 74 LC_ENTER_MACRO, /* Begin macro expansion. */ 75 /* FIXME: add support for stringize and paste. */ 76 LC_HWM /* High Water Mark. */ 77 }; 78 79 /* The typedef "location_t" is a key within the location database, 80 identifying a source location or macro expansion, along with range 81 information, and (optionally) a pointer for use by gcc. 82 83 This key only has meaning in relation to a line_maps instance. Within 84 gcc there is a single line_maps instance: "line_table", declared in 85 gcc/input.h and defined in gcc/input.c. 86 87 The values of the keys are intended to be internal to libcpp, 88 but for ease-of-understanding the implementation, they are currently 89 assigned as follows: 90 91 Actual | Value | Meaning 92 -----------+-------------------------------+------------------------------- 93 0x00000000 | UNKNOWN_LOCATION (gcc/input.h)| Unknown/invalid location. 94 -----------+-------------------------------+------------------------------- 95 0x00000001 | BUILTINS_LOCATION | The location for declarations 96 | (gcc/input.h) | in "<built-in>" 97 -----------+-------------------------------+------------------------------- 98 0x00000002 | RESERVED_LOCATION_COUNT | The first location to be 99 | (also | handed out, and the 100 | ordmap[0]->start_location) | first line in ordmap 0 101 -----------+-------------------------------+------------------------------- 102 | ordmap[1]->start_location | First line in ordmap 1 103 | ordmap[1]->start_location+32 | First column in that line 104 | (assuming range_bits == 5) | 105 | ordmap[1]->start_location+64 | 2nd column in that line 106 | ordmap[1]->start_location+4096| Second line in ordmap 1 107 | (assuming column_bits == 12) 108 | 109 | Subsequent lines are offset by (1 << column_bits), 110 | e.g. 4096 for 12 bits, with a column value of 0 representing 111 | "the whole line". 112 | 113 | Within a line, the low "range_bits" (typically 5) are used for 114 | storing short ranges, so that there's an offset of 115 | (1 << range_bits) between individual columns within a line, 116 | typically 32. 117 | The low range_bits store the offset of the end point from the 118 | start point, and the start point is found by masking away 119 | the range bits. 120 | 121 | For example: 122 | ordmap[1]->start_location+64 "2nd column in that line" 123 | above means a caret at that location, with a range 124 | starting and finishing at the same place (the range bits 125 | are 0), a range of length 1. 126 | 127 | By contrast: 128 | ordmap[1]->start_location+68 129 | has range bits 0x4, meaning a caret with a range starting at 130 | that location, but with endpoint 4 columns further on: a range 131 | of length 5. 132 | 133 | Ranges that have caret != start, or have an endpoint too 134 | far away to fit in range_bits are instead stored as ad-hoc 135 | locations. Hence for range_bits == 5 we can compactly store 136 | tokens of length <= 32 without needing to use the ad-hoc 137 | table. 138 | 139 | This packing scheme means we effectively have 140 | (column_bits - range_bits) 141 | of bits for the columns, typically (12 - 5) = 7, for 128 142 | columns; longer line widths are accomodated by starting a 143 | new ordmap with a higher column_bits. 144 | 145 | ordmap[2]->start_location-1 | Final location in ordmap 1 146 -----------+-------------------------------+------------------------------- 147 | ordmap[2]->start_location | First line in ordmap 2 148 | ordmap[3]->start_location-1 | Final location in ordmap 2 149 -----------+-------------------------------+------------------------------- 150 | | (etc) 151 -----------+-------------------------------+------------------------------- 152 | ordmap[n-1]->start_location | First line in final ord map 153 | | (etc) 154 | set->highest_location - 1 | Final location in that ordmap 155 -----------+-------------------------------+------------------------------- 156 | set->highest_location | Location of the where the next 157 | | ordinary linemap would start 158 -----------+-------------------------------+------------------------------- 159 | | 160 | VVVVVVVVVVVVVVVVVVVVVVVVVVV 161 | Ordinary maps grow this way 162 | 163 | (unallocated integers) 164 | 165 0x60000000 | LINE_MAP_MAX_LOCATION_WITH_COLS 166 | Beyond this point, ordinary linemaps have 0 bits per column: 167 | each increment of the value corresponds to a new source line. 168 | 169 0x70000000 | LINE_MAP_MAX_LOCATION 170 | Beyond the point, we give up on ordinary maps; attempts to 171 | create locations in them lead to UNKNOWN_LOCATION (0). 172 | 173 | (unallocated integers) 174 | 175 | Macro maps grow this way 176 | ^^^^^^^^^^^^^^^^^^^^^^^^ 177 | | 178 -----------+-------------------------------+------------------------------- 179 | LINEMAPS_MACRO_LOWEST_LOCATION| Locations within macro maps 180 | macromap[m-1]->start_location | Start of last macro map 181 | | 182 -----------+-------------------------------+------------------------------- 183 | macromap[m-2]->start_location | Start of penultimate macro map 184 -----------+-------------------------------+------------------------------- 185 | macromap[1]->start_location | Start of macro map 1 186 -----------+-------------------------------+------------------------------- 187 | macromap[0]->start_location | Start of macro map 0 188 0x7fffffff | MAX_LOCATION_T | Also used as a mask for 189 | | accessing the ad-hoc data table 190 -----------+-------------------------------+------------------------------- 191 0x80000000 | Start of ad-hoc values; the lower 31 bits are used as an index 192 ... | into the line_table->location_adhoc_data_map.data array. 193 0xffffffff | UINT_MAX | 194 -----------+-------------------------------+------------------------------- 195 196 Examples of location encoding. 197 198 Packed ranges 199 ============= 200 201 Consider encoding the location of a token "foo", seen underlined here 202 on line 523, within an ordinary line_map that starts at line 500: 203 204 11111111112 205 12345678901234567890 206 522 207 523 return foo + bar; 208 ^~~ 209 524 210 211 The location's caret and start are both at line 523, column 11; the 212 location's finish is on the same line, at column 13 (an offset of 2 213 columns, for length 3). 214 215 Line 523 is offset 23 from the starting line of the ordinary line_map. 216 217 caret == start, and the offset of the finish fits within 5 bits, so 218 this can be stored as a packed range. 219 220 This is encoded as: 221 ordmap->start 222 + (line_offset << ordmap->m_column_and_range_bits) 223 + (column << ordmap->m_range_bits) 224 + (range_offset); 225 i.e. (for line offset 23, column 11, range offset 2): 226 ordmap->start 227 + (23 << 12) 228 + (11 << 5) 229 + 2; 230 i.e.: 231 ordmap->start + 0x17162 232 assuming that the line_map uses the default of 7 bits for columns and 233 5 bits for packed range (giving 12 bits for m_column_and_range_bits). 234 235 236 "Pure" locations 237 ================ 238 239 These are a special case of the above, where 240 caret == start == finish 241 They are stored as packed ranges with offset == 0. 242 For example, the location of the "f" of "foo" could be stored 243 as above, but with range offset 0, giving: 244 ordmap->start 245 + (23 << 12) 246 + (11 << 5) 247 + 0; 248 i.e.: 249 ordmap->start + 0x17160 250 251 252 Unoptimized ranges 253 ================== 254 255 Consider encoding the location of the binary expression 256 below: 257 258 11111111112 259 12345678901234567890 260 522 261 523 return foo + bar; 262 ~~~~^~~~~ 263 524 264 265 The location's caret is at the "+", line 523 column 15, but starts 266 earlier, at the "f" of "foo" at column 11. The finish is at the "r" 267 of "bar" at column 19. 268 269 This can't be stored as a packed range since start != caret. 270 Hence it is stored as an ad-hoc location e.g. 0x80000003. 271 272 Stripping off the top bit gives us an index into the ad-hoc 273 lookaside table: 274 275 line_table->location_adhoc_data_map.data[0x3] 276 277 from which the caret, start and finish can be looked up, 278 encoded as "pure" locations: 279 280 start == ordmap->start + (23 << 12) + (11 << 5) 281 == ordmap->start + 0x17160 (as above; the "f" of "foo") 282 283 caret == ordmap->start + (23 << 12) + (15 << 5) 284 == ordmap->start + 0x171e0 285 286 finish == ordmap->start + (23 << 12) + (19 << 5) 287 == ordmap->start + 0x17260 288 289 To further see how location_t works in practice, see the 290 worked example in libcpp/location-example.txt. */ 291 typedef unsigned int location_t; 292 293 /* Do not track column numbers higher than this one. As a result, the 294 range of column_bits is [12, 18] (or 0 if column numbers are 295 disabled). */ 296 const unsigned int LINE_MAP_MAX_COLUMN_NUMBER = (1U << 12); 297 298 /* Do not pack ranges if locations get higher than this. 299 If you change this, update: 300 gcc.dg/plugin/location-overflow-test-*.c. */ 301 const location_t LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES = 0x50000000; 302 303 /* Do not track column numbers if locations get higher than this. 304 If you change this, update: 305 gcc.dg/plugin/location-overflow-test-*.c. */ 306 const location_t LINE_MAP_MAX_LOCATION_WITH_COLS = 0x60000000; 307 308 /* Highest possible source location encoded within an ordinary map. */ 309 const location_t LINE_MAP_MAX_LOCATION = 0x70000000; 310 311 /* A range of source locations. 312 313 Ranges are closed: 314 m_start is the first location within the range, 315 m_finish is the last location within the range. 316 317 We may need a more compact way to store these, but for now, 318 let's do it the simple way, as a pair. */ 319 struct GTY(()) source_range 320 { 321 location_t m_start; 322 location_t m_finish; 323 324 /* We avoid using constructors, since various structs that 325 don't yet have constructors will embed instances of 326 source_range. */ 327 328 /* Make a source_range from a location_t. */ 329 static source_range from_location (location_t loc) 330 { 331 source_range result; 332 result.m_start = loc; 333 result.m_finish = loc; 334 return result; 335 } 336 337 /* Make a source_range from a pair of location_t. */ 338 static source_range from_locations (location_t start, 339 location_t finish) 340 { 341 source_range result; 342 result.m_start = start; 343 result.m_finish = finish; 344 return result; 345 } 346 }; 347 348 /* Memory allocation function typedef. Works like xrealloc. */ 349 typedef void *(*line_map_realloc) (void *, size_t); 350 351 /* Memory allocator function that returns the actual allocated size, 352 for a given requested allocation. */ 353 typedef size_t (*line_map_round_alloc_size_func) (size_t); 354 355 /* A line_map encodes a sequence of locations. 356 There are two kinds of maps. Ordinary maps and macro expansion 357 maps, a.k.a macro maps. 358 359 A macro map encodes source locations of tokens that are part of a 360 macro replacement-list, at a macro expansion point. E.g, in: 361 362 #define PLUS(A,B) A + B 363 364 No macro map is going to be created there, because we are not at a 365 macro expansion point. We are at a macro /definition/ point. So the 366 locations of the tokens of the macro replacement-list (i.e, A + B) 367 will be locations in an ordinary map, not a macro map. 368 369 On the other hand, if we later do: 370 371 int a = PLUS (1,2); 372 373 The invocation of PLUS here is a macro expansion. So we are at a 374 macro expansion point. The preprocessor expands PLUS (1,2) and 375 replaces it with the tokens of its replacement-list: 1 + 2. A macro 376 map is going to be created to hold (or rather to map, haha ...) the 377 locations of the tokens 1, + and 2. The macro map also records the 378 location of the expansion point of PLUS. That location is mapped in 379 the map that is active right before the location of the invocation 380 of PLUS. */ 381 382 /* This contains GTY mark-up to support precompiled headers. 383 line_map is an abstract class, only derived objects exist. */ 384 struct GTY((tag ("0"), desc ("MAP_ORDINARY_P (&%h) ? 1 : 2"))) line_map { 385 location_t start_location; 386 387 /* Size and alignment is (usually) 4 bytes. */ 388 }; 389 390 /* An ordinary line map encodes physical source locations. Those 391 physical source locations are called "spelling locations". 392 393 Physical source file TO_FILE at line TO_LINE at column 0 is represented 394 by the logical START_LOCATION. TO_LINE+L at column C is represented by 395 START_LOCATION+(L*(1<<m_column_and_range_bits))+(C*1<<m_range_bits), as 396 long as C<(1<<effective range bits), and the result_location is less than 397 the next line_map's start_location. 398 (The top line is line 1 and the leftmost column is column 1; line/column 0 399 means "entire file/line" or "unknown line/column" or "not applicable".) 400 401 The highest possible source location is MAX_LOCATION_T. */ 402 struct GTY((tag ("1"))) line_map_ordinary : public line_map { 403 /* Base class is 4 bytes. */ 404 405 /* 4 bytes of integers, each 1 byte for easy extraction/insertion. */ 406 407 /* The reason for creation of this line map. */ 408 ENUM_BITFIELD (lc_reason) reason : 8; 409 410 /* SYSP is one for a system header, two for a C system header file 411 that therefore needs to be extern "C" protected in C++, and zero 412 otherwise. This field isn't really needed now that it's in 413 cpp_buffer. */ 414 unsigned char sysp; 415 416 /* Number of the low-order location_t bits used for column numbers 417 and ranges. */ 418 unsigned int m_column_and_range_bits : 8; 419 420 /* Number of the low-order "column" bits used for storing short ranges 421 inline, rather than in the ad-hoc table. 422 MSB LSB 423 31 0 424 +-------------------------+-------------------------------------------+ 425 | |<---map->column_and_range_bits (e.g. 12)-->| 426 +-------------------------+-----------------------+-------------------+ 427 | | column_and_range_bits | map->range_bits | 428 | | - range_bits | | 429 +-------------------------+-----------------------+-------------------+ 430 | row bits | effective column bits | short range bits | 431 | | (e.g. 7) | (e.g. 5) | 432 +-------------------------+-----------------------+-------------------+ */ 433 unsigned int m_range_bits : 8; 434 435 /* Pointer alignment boundary on both 32 and 64-bit systems. */ 436 437 const char *to_file; 438 linenum_type to_line; 439 440 /* Location from whence this line map was included. For regular 441 #includes, this location will be the last location of a map. For 442 outermost file, this is 0. */ 443 location_t included_from; 444 445 /* Size is 20 or 24 bytes, no padding */ 446 }; 447 448 /* This is the highest possible source location encoded within an 449 ordinary or macro map. */ 450 const location_t MAX_LOCATION_T = 0x7FFFFFFF; 451 452 struct cpp_hashnode; 453 454 /* A macro line map encodes location of tokens coming from a macro 455 expansion. 456 457 The offset from START_LOCATION is used to index into 458 MACRO_LOCATIONS; this holds the original location of the token. */ 459 struct GTY((tag ("2"))) line_map_macro : public line_map { 460 /* Base is 4 bytes. */ 461 462 /* The number of tokens inside the replacement-list of MACRO. */ 463 unsigned int n_tokens; 464 465 /* Pointer alignment boundary. */ 466 467 /* The cpp macro whose expansion gave birth to this macro map. */ 468 struct cpp_hashnode * 469 GTY ((nested_ptr (union tree_node, 470 "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL", 471 "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL"))) 472 macro; 473 474 /* This array of location is actually an array of pairs of 475 locations. The elements inside it thus look like: 476 477 x0,y0, x1,y1, x2,y2, ...., xn,yn. 478 479 where n == n_tokens; 480 481 Remember that these xI,yI are collected when libcpp is about to 482 expand a given macro. 483 484 yI is the location in the macro definition, either of the token 485 itself or of a macro parameter that it replaces. 486 487 Imagine this: 488 489 #define PLUS(A, B) A + B <--- #1 490 491 int a = PLUS (1,2); <--- #2 492 493 There is a macro map for the expansion of PLUS in #2. PLUS is 494 expanded into its expansion-list. The expansion-list is the 495 replacement-list of PLUS where the macro parameters are replaced 496 with their arguments. So the replacement-list of PLUS is made of 497 the tokens: 498 499 A, +, B 500 501 and the expansion-list is made of the tokens: 502 503 1, +, 2 504 505 Let's consider the case of token "+". Its y1 [yI for I == 1] is 506 its spelling location in #1. 507 508 y0 (thus for token "1") is the spelling location of A in #1. 509 510 And y2 (of token "2") is the spelling location of B in #1. 511 512 When the token is /not/ an argument for a macro, xI is the same 513 location as yI. Otherwise, xI is the location of the token 514 outside this macro expansion. If this macro was expanded from 515 another macro expansion, xI is a virtual location representing 516 the token in that macro expansion; otherwise, it is the spelling 517 location of the token. 518 519 Note that a virtual location is a location returned by 520 linemap_add_macro_token. It encodes the relevant locations (x,y 521 pairs) of that token across the macro expansions from which it 522 (the token) might come from. 523 524 In the example above x1 (for token "+") is going to be the same 525 as y1. x0 is the spelling location for the argument token "1", 526 and x2 is the spelling location for the argument token "2". */ 527 location_t * GTY((atomic)) macro_locations; 528 529 /* This is the location of the expansion point of the current macro 530 map. It's the location of the macro name. That location is held 531 by the map that was current right before the current one. It 532 could have been either a macro or an ordinary map, depending on 533 if we are in a nested expansion context not. */ 534 location_t expansion; 535 536 /* Size is 20 or 32 (4 bytes padding on 64-bit). */ 537 }; 538 539 #if CHECKING_P && (GCC_VERSION >= 2007) 540 541 /* Assertion macro to be used in line-map code. */ 542 #define linemap_assert(EXPR) \ 543 do { \ 544 if (! (EXPR)) \ 545 abort (); \ 546 } while (0) 547 548 /* Assert that becomes a conditional expression when checking is disabled at 549 compilation time. Use this for conditions that should not happen but if 550 they happen, it is better to handle them gracefully rather than crash 551 randomly later. 552 Usage: 553 554 if (linemap_assert_fails(EXPR)) handle_error(); */ 555 #define linemap_assert_fails(EXPR) __extension__ \ 556 ({linemap_assert (EXPR); false;}) 557 558 #else 559 /* Include EXPR, so that unused variable warnings do not occur. */ 560 #define linemap_assert(EXPR) ((void)(0 && (EXPR))) 561 #define linemap_assert_fails(EXPR) (! (EXPR)) 562 #endif 563 564 /* Get whether location LOC is an ad-hoc, ordinary or macro location. */ 565 566 inline bool 567 IS_ORDINARY_LOC (location_t loc) 568 { 569 return loc < LINE_MAP_MAX_LOCATION; 570 } 571 572 inline bool 573 IS_ADHOC_LOC (location_t loc) 574 { 575 return loc > MAX_LOCATION_T; 576 } 577 578 inline bool 579 IS_MACRO_LOC (location_t loc) 580 { 581 return !IS_ORDINARY_LOC (loc) && !IS_ADHOC_LOC (loc); 582 } 583 584 /* Categorize line map kinds. */ 585 586 inline bool 587 MAP_ORDINARY_P (const line_map *map) 588 { 589 return IS_ORDINARY_LOC (map->start_location); 590 } 591 592 /* Return TRUE if MAP encodes locations coming from a macro 593 replacement-list at macro expansion point. */ 594 bool 595 linemap_macro_expansion_map_p (const struct line_map *); 596 597 /* Assert that MAP encodes locations of tokens that are not part of 598 the replacement-list of a macro expansion, downcasting from 599 line_map * to line_map_ordinary *. */ 600 601 inline line_map_ordinary * 602 linemap_check_ordinary (struct line_map *map) 603 { 604 linemap_assert (MAP_ORDINARY_P (map)); 605 return (line_map_ordinary *)map; 606 } 607 608 /* Assert that MAP encodes locations of tokens that are not part of 609 the replacement-list of a macro expansion, downcasting from 610 const line_map * to const line_map_ordinary *. */ 611 612 inline const line_map_ordinary * 613 linemap_check_ordinary (const struct line_map *map) 614 { 615 linemap_assert (MAP_ORDINARY_P (map)); 616 return (const line_map_ordinary *)map; 617 } 618 619 /* Assert that MAP is a macro expansion and downcast to the appropriate 620 subclass. */ 621 622 inline line_map_macro *linemap_check_macro (line_map *map) 623 { 624 linemap_assert (!MAP_ORDINARY_P (map)); 625 return (line_map_macro *)map; 626 } 627 628 /* Assert that MAP is a macro expansion and downcast to the appropriate 629 subclass. */ 630 631 inline const line_map_macro * 632 linemap_check_macro (const line_map *map) 633 { 634 linemap_assert (!MAP_ORDINARY_P (map)); 635 return (const line_map_macro *)map; 636 } 637 638 /* Read the start location of MAP. */ 639 640 inline location_t 641 MAP_START_LOCATION (const line_map *map) 642 { 643 return map->start_location; 644 } 645 646 /* Get the starting line number of ordinary map MAP. */ 647 648 inline linenum_type 649 ORDINARY_MAP_STARTING_LINE_NUMBER (const line_map_ordinary *ord_map) 650 { 651 return ord_map->to_line; 652 } 653 654 /* Return a positive value if map encodes locations from a system 655 header, 0 otherwise. Returns 1 if ordinary map MAP encodes locations 656 in a system header and 2 if it encodes locations in a C system header 657 that therefore needs to be extern "C" protected in C++. */ 658 659 inline unsigned char 660 ORDINARY_MAP_IN_SYSTEM_HEADER_P (const line_map_ordinary *ord_map) 661 { 662 return ord_map->sysp; 663 } 664 665 /* Get the filename of ordinary map MAP. */ 666 667 inline const char * 668 ORDINARY_MAP_FILE_NAME (const line_map_ordinary *ord_map) 669 { 670 return ord_map->to_file; 671 } 672 673 /* Get the cpp macro whose expansion gave birth to macro map MAP. */ 674 675 inline cpp_hashnode * 676 MACRO_MAP_MACRO (const line_map_macro *macro_map) 677 { 678 return macro_map->macro; 679 } 680 681 /* Get the number of tokens inside the replacement-list of the macro 682 that led to macro map MAP. */ 683 684 inline unsigned int 685 MACRO_MAP_NUM_MACRO_TOKENS (const line_map_macro *macro_map) 686 { 687 return macro_map->n_tokens; 688 } 689 690 /* Get the array of pairs of locations within macro map MAP. 691 See the declaration of line_map_macro for more information. */ 692 693 inline location_t * 694 MACRO_MAP_LOCATIONS (const line_map_macro *macro_map) 695 { 696 return macro_map->macro_locations; 697 } 698 699 /* Get the location of the expansion point of the macro map MAP. */ 700 701 inline location_t 702 MACRO_MAP_EXPANSION_POINT_LOCATION (const line_map_macro *macro_map) 703 { 704 return macro_map->expansion; 705 } 706 707 /* The abstraction of a set of location maps. There can be several 708 types of location maps. This abstraction contains the attributes 709 that are independent from the type of the map. 710 711 Essentially this is just a vector of T_linemap_subclass, 712 which can only ever grow in size. */ 713 714 struct GTY(()) maps_info_ordinary { 715 /* This array contains the "ordinary" line maps, for all 716 events other than macro expansion 717 (e.g. when a new preprocessing unit starts or ends). */ 718 line_map_ordinary * GTY ((length ("%h.used"))) maps; 719 720 /* The total number of allocated maps. */ 721 unsigned int allocated; 722 723 /* The number of elements used in maps. This number is smaller 724 or equal to ALLOCATED. */ 725 unsigned int used; 726 727 unsigned int cache; 728 }; 729 730 struct GTY(()) maps_info_macro { 731 /* This array contains the macro line maps. 732 A macro line map is created whenever a macro expansion occurs. */ 733 line_map_macro * GTY ((length ("%h.used"))) maps; 734 735 /* The total number of allocated maps. */ 736 unsigned int allocated; 737 738 /* The number of elements used in maps. This number is smaller 739 or equal to ALLOCATED. */ 740 unsigned int used; 741 742 unsigned int cache; 743 }; 744 745 /* Data structure to associate a source_range together with an arbitrary 746 data pointer with a source location. */ 747 struct GTY(()) location_adhoc_data { 748 location_t locus; 749 source_range src_range; 750 void * GTY((skip)) data; 751 }; 752 753 struct htab; 754 755 /* The following data structure encodes a location with some adhoc data 756 and maps it to a new unsigned integer (called an adhoc location) 757 that replaces the original location to represent the mapping. 758 759 The new adhoc_loc uses the highest bit as the enabling bit, i.e. if the 760 highest bit is 1, then the number is adhoc_loc. Otherwise, it serves as 761 the original location. Once identified as the adhoc_loc, the lower 31 762 bits of the integer is used to index the location_adhoc_data array, 763 in which the locus and associated data is stored. */ 764 765 struct GTY(()) location_adhoc_data_map { 766 struct htab * GTY((skip)) htab; 767 location_t curr_loc; 768 unsigned int allocated; 769 struct location_adhoc_data GTY((length ("%h.allocated"))) *data; 770 }; 771 772 /* A set of chronological line_map structures. */ 773 struct GTY(()) line_maps { 774 775 ~line_maps (); 776 777 maps_info_ordinary info_ordinary; 778 779 maps_info_macro info_macro; 780 781 /* Depth of the include stack, including the current file. */ 782 unsigned int depth; 783 784 /* If true, prints an include trace a la -H. */ 785 bool trace_includes; 786 787 /* Highest location_t "given out". */ 788 location_t highest_location; 789 790 /* Start of line of highest location_t "given out". */ 791 location_t highest_line; 792 793 /* The maximum column number we can quickly allocate. Higher numbers 794 may require allocating a new line_map. */ 795 unsigned int max_column_hint; 796 797 /* The allocator to use when resizing 'maps', defaults to xrealloc. */ 798 line_map_realloc reallocator; 799 800 /* The allocators' function used to know the actual size it 801 allocated, for a certain allocation size requested. */ 802 line_map_round_alloc_size_func round_alloc_size; 803 804 struct location_adhoc_data_map location_adhoc_data_map; 805 806 /* The special location value that is used as spelling location for 807 built-in tokens. */ 808 location_t builtin_location; 809 810 /* True if we've seen a #line or # 44 "file" directive. */ 811 bool seen_line_directive; 812 813 /* The default value of range_bits in ordinary line maps. */ 814 unsigned int default_range_bits; 815 816 unsigned int num_optimized_ranges; 817 unsigned int num_unoptimized_ranges; 818 }; 819 820 /* Returns the number of allocated maps so far. MAP_KIND shall be TRUE 821 if we are interested in macro maps, FALSE otherwise. */ 822 inline unsigned int 823 LINEMAPS_ALLOCATED (const line_maps *set, bool map_kind) 824 { 825 if (map_kind) 826 return set->info_macro.allocated; 827 else 828 return set->info_ordinary.allocated; 829 } 830 831 /* As above, but by reference (e.g. as an lvalue). */ 832 833 inline unsigned int & 834 LINEMAPS_ALLOCATED (line_maps *set, bool map_kind) 835 { 836 if (map_kind) 837 return set->info_macro.allocated; 838 else 839 return set->info_ordinary.allocated; 840 } 841 842 /* Returns the number of used maps so far. MAP_KIND shall be TRUE if 843 we are interested in macro maps, FALSE otherwise.*/ 844 inline unsigned int 845 LINEMAPS_USED (const line_maps *set, bool map_kind) 846 { 847 if (map_kind) 848 return set->info_macro.used; 849 else 850 return set->info_ordinary.used; 851 } 852 853 /* As above, but by reference (e.g. as an lvalue). */ 854 855 inline unsigned int & 856 LINEMAPS_USED (line_maps *set, bool map_kind) 857 { 858 if (map_kind) 859 return set->info_macro.used; 860 else 861 return set->info_ordinary.used; 862 } 863 864 /* Returns the index of the last map that was looked up with 865 linemap_lookup. MAP_KIND shall be TRUE if we are interested in 866 macro maps, FALSE otherwise. */ 867 inline unsigned int 868 LINEMAPS_CACHE (const line_maps *set, bool map_kind) 869 { 870 if (map_kind) 871 return set->info_macro.cache; 872 else 873 return set->info_ordinary.cache; 874 } 875 876 /* As above, but by reference (e.g. as an lvalue). */ 877 878 inline unsigned int & 879 LINEMAPS_CACHE (line_maps *set, bool map_kind) 880 { 881 if (map_kind) 882 return set->info_macro.cache; 883 else 884 return set->info_ordinary.cache; 885 } 886 887 /* Return the map at a given index. */ 888 inline line_map * 889 LINEMAPS_MAP_AT (const line_maps *set, bool map_kind, int index) 890 { 891 if (map_kind) 892 return &set->info_macro.maps[index]; 893 else 894 return &set->info_ordinary.maps[index]; 895 } 896 897 /* Returns the last map used in the line table SET. MAP_KIND 898 shall be TRUE if we are interested in macro maps, FALSE 899 otherwise.*/ 900 inline line_map * 901 LINEMAPS_LAST_MAP (const line_maps *set, bool map_kind) 902 { 903 return LINEMAPS_MAP_AT (set, map_kind, 904 LINEMAPS_USED (set, map_kind) - 1); 905 } 906 907 /* Returns the last map that was allocated in the line table SET. 908 MAP_KIND shall be TRUE if we are interested in macro maps, FALSE 909 otherwise.*/ 910 inline line_map * 911 LINEMAPS_LAST_ALLOCATED_MAP (const line_maps *set, bool map_kind) 912 { 913 return LINEMAPS_MAP_AT (set, map_kind, 914 LINEMAPS_ALLOCATED (set, map_kind) - 1); 915 } 916 917 /* Returns a pointer to the memory region where ordinary maps are 918 allocated in the line table SET. */ 919 inline line_map_ordinary * 920 LINEMAPS_ORDINARY_MAPS (const line_maps *set) 921 { 922 return set->info_ordinary.maps; 923 } 924 925 /* Returns the INDEXth ordinary map. */ 926 inline line_map_ordinary * 927 LINEMAPS_ORDINARY_MAP_AT (const line_maps *set, int index) 928 { 929 linemap_assert (index >= 0); 930 linemap_assert ((unsigned int)index < set->info_ordinary.used); 931 return &set->info_ordinary.maps[index]; 932 } 933 934 /* Return the number of ordinary maps allocated in the line table 935 SET. */ 936 inline unsigned int 937 LINEMAPS_ORDINARY_ALLOCATED (const line_maps *set) 938 { 939 return LINEMAPS_ALLOCATED (set, false); 940 } 941 942 /* Return the number of ordinary maps used in the line table SET. */ 943 inline unsigned int 944 LINEMAPS_ORDINARY_USED (const line_maps *set) 945 { 946 return LINEMAPS_USED (set, false); 947 } 948 949 /* Return the index of the last ordinary map that was looked up with 950 linemap_lookup. */ 951 inline unsigned int 952 LINEMAPS_ORDINARY_CACHE (const line_maps *set) 953 { 954 return LINEMAPS_CACHE (set, false); 955 } 956 957 /* As above, but by reference (e.g. as an lvalue). */ 958 959 inline unsigned int & 960 LINEMAPS_ORDINARY_CACHE (line_maps *set) 961 { 962 return LINEMAPS_CACHE (set, false); 963 } 964 965 /* Returns a pointer to the last ordinary map used in the line table 966 SET. */ 967 inline line_map_ordinary * 968 LINEMAPS_LAST_ORDINARY_MAP (const line_maps *set) 969 { 970 return (line_map_ordinary *)LINEMAPS_LAST_MAP (set, false); 971 } 972 973 /* Returns a pointer to the last ordinary map allocated the line table 974 SET. */ 975 inline line_map_ordinary * 976 LINEMAPS_LAST_ALLOCATED_ORDINARY_MAP (const line_maps *set) 977 { 978 return (line_map_ordinary *)LINEMAPS_LAST_ALLOCATED_MAP (set, false); 979 } 980 981 /* Returns a pointer to the beginning of the region where macro maps 982 are allocated. */ 983 inline line_map_macro * 984 LINEMAPS_MACRO_MAPS (const line_maps *set) 985 { 986 return set->info_macro.maps; 987 } 988 989 /* Returns the INDEXth macro map. */ 990 inline line_map_macro * 991 LINEMAPS_MACRO_MAP_AT (const line_maps *set, int index) 992 { 993 linemap_assert (index >= 0); 994 linemap_assert ((unsigned int)index < set->info_macro.used); 995 return &set->info_macro.maps[index]; 996 } 997 998 /* Returns the number of macro maps that were allocated in the line 999 table SET. */ 1000 inline unsigned int 1001 LINEMAPS_MACRO_ALLOCATED (const line_maps *set) 1002 { 1003 return LINEMAPS_ALLOCATED (set, true); 1004 } 1005 1006 /* Returns the number of macro maps used in the line table SET. */ 1007 inline unsigned int 1008 LINEMAPS_MACRO_USED (const line_maps *set) 1009 { 1010 return LINEMAPS_USED (set, true); 1011 } 1012 1013 /* Returns the index of the last macro map looked up with 1014 linemap_lookup. */ 1015 inline unsigned int 1016 LINEMAPS_MACRO_CACHE (const line_maps *set) 1017 { 1018 return LINEMAPS_CACHE (set, true); 1019 } 1020 1021 /* As above, but by reference (e.g. as an lvalue). */ 1022 1023 inline unsigned int & 1024 LINEMAPS_MACRO_CACHE (line_maps *set) 1025 { 1026 return LINEMAPS_CACHE (set, true); 1027 } 1028 1029 /* Returns the last macro map used in the line table SET. */ 1030 inline line_map_macro * 1031 LINEMAPS_LAST_MACRO_MAP (const line_maps *set) 1032 { 1033 return (line_map_macro *)LINEMAPS_LAST_MAP (set, true); 1034 } 1035 1036 /* Returns the lowest location [of a token resulting from macro 1037 expansion] encoded in this line table. */ 1038 inline location_t 1039 LINEMAPS_MACRO_LOWEST_LOCATION (const line_maps *set) 1040 { 1041 return LINEMAPS_MACRO_USED (set) 1042 ? MAP_START_LOCATION (LINEMAPS_LAST_MACRO_MAP (set)) 1043 : MAX_LOCATION_T + 1; 1044 } 1045 1046 /* Returns the last macro map allocated in the line table SET. */ 1047 inline line_map_macro * 1048 LINEMAPS_LAST_ALLOCATED_MACRO_MAP (const line_maps *set) 1049 { 1050 return (line_map_macro *)LINEMAPS_LAST_ALLOCATED_MAP (set, true); 1051 } 1052 1053 extern location_t get_combined_adhoc_loc (struct line_maps *, 1054 location_t, 1055 source_range, 1056 void *); 1057 extern void *get_data_from_adhoc_loc (struct line_maps *, location_t); 1058 extern location_t get_location_from_adhoc_loc (struct line_maps *, 1059 location_t); 1060 1061 extern source_range get_range_from_loc (line_maps *set, location_t loc); 1062 1063 /* Get whether location LOC is a "pure" location, or 1064 whether it is an ad-hoc location, or embeds range information. */ 1065 1066 bool 1067 pure_location_p (line_maps *set, location_t loc); 1068 1069 /* Given location LOC within SET, strip away any packed range information 1070 or ad-hoc information. */ 1071 1072 extern location_t get_pure_location (line_maps *set, 1073 location_t loc); 1074 1075 /* Combine LOC and BLOCK, giving a combined adhoc location. */ 1076 1077 inline location_t 1078 COMBINE_LOCATION_DATA (struct line_maps *set, 1079 location_t loc, 1080 source_range src_range, 1081 void *block) 1082 { 1083 return get_combined_adhoc_loc (set, loc, src_range, block); 1084 } 1085 1086 extern void rebuild_location_adhoc_htab (struct line_maps *); 1087 1088 /* Initialize a line map set. SET is the line map set to initialize 1089 and BUILTIN_LOCATION is the special location value to be used as 1090 spelling location for built-in tokens. This BUILTIN_LOCATION has 1091 to be strictly less than RESERVED_LOCATION_COUNT. */ 1092 extern void linemap_init (struct line_maps *set, 1093 location_t builtin_location); 1094 1095 /* Check for and warn about line_maps entered but not exited. */ 1096 1097 extern void linemap_check_files_exited (struct line_maps *); 1098 1099 /* Return a location_t for the start (i.e. column==0) of 1100 (physical) line TO_LINE in the current source file (as in the 1101 most recent linemap_add). MAX_COLUMN_HINT is the highest column 1102 number we expect to use in this line (but it does not change 1103 the highest_location). */ 1104 1105 extern location_t linemap_line_start 1106 (struct line_maps *set, linenum_type to_line, unsigned int max_column_hint); 1107 1108 /* Add a mapping of logical source line to physical source file and 1109 line number. This function creates an "ordinary map", which is a 1110 map that records locations of tokens that are not part of macro 1111 replacement-lists present at a macro expansion point. 1112 1113 The text pointed to by TO_FILE must have a lifetime 1114 at least as long as the lifetime of SET. An empty 1115 TO_FILE means standard input. If reason is LC_LEAVE, and 1116 TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their 1117 natural values considering the file we are returning to. 1118 1119 A call to this function can relocate the previous set of 1120 maps, so any stored line_map pointers should not be used. */ 1121 extern const struct line_map *linemap_add 1122 (struct line_maps *, enum lc_reason, unsigned int sysp, 1123 const char *to_file, linenum_type to_line); 1124 1125 /* Given a logical source location, returns the map which the 1126 corresponding (source file, line, column) triplet can be deduced 1127 from. Since the set is built chronologically, the logical lines are 1128 monotonic increasing, and so the list is sorted and we can use a 1129 binary search. If no line map have been allocated yet, this 1130 function returns NULL. */ 1131 extern const struct line_map *linemap_lookup 1132 (struct line_maps *, location_t); 1133 1134 /* Returns TRUE if the line table set tracks token locations across 1135 macro expansion, FALSE otherwise. */ 1136 bool linemap_tracks_macro_expansion_locs_p (struct line_maps *); 1137 1138 /* Return the name of the macro associated to MACRO_MAP. */ 1139 const char* linemap_map_get_macro_name (const line_map_macro *); 1140 1141 /* Return a positive value if LOCATION is the locus of a token that is 1142 located in a system header, O otherwise. It returns 1 if LOCATION 1143 is the locus of a token that is located in a system header, and 2 1144 if LOCATION is the locus of a token located in a C system header 1145 that therefore needs to be extern "C" protected in C++. 1146 1147 Note that this function returns 1 if LOCATION belongs to a token 1148 that is part of a macro replacement-list defined in a system 1149 header, but expanded in a non-system file. */ 1150 int linemap_location_in_system_header_p (struct line_maps *, 1151 location_t); 1152 1153 /* Return TRUE if LOCATION is a source code location of a token that is part of 1154 a macro expansion, FALSE otherwise. */ 1155 bool linemap_location_from_macro_expansion_p (const struct line_maps *, 1156 location_t); 1157 1158 /* TRUE if LOCATION is a source code location of a token that is part of the 1159 definition of a macro, FALSE otherwise. */ 1160 bool linemap_location_from_macro_definition_p (struct line_maps *, 1161 location_t); 1162 1163 /* With the precondition that LOCATION is the locus of a token that is 1164 an argument of a function-like macro MACRO_MAP and appears in the 1165 expansion of MACRO_MAP, return the locus of that argument in the 1166 context of the caller of MACRO_MAP. */ 1167 1168 extern location_t linemap_macro_map_loc_unwind_toward_spelling 1169 (line_maps *set, const line_map_macro *macro_map, location_t location); 1170 1171 /* location_t values from 0 to RESERVED_LOCATION_COUNT-1 will 1172 be reserved for libcpp user as special values, no token from libcpp 1173 will contain any of those locations. */ 1174 const location_t RESERVED_LOCATION_COUNT = 2; 1175 1176 /* Converts a map and a location_t to source line. */ 1177 inline linenum_type 1178 SOURCE_LINE (const line_map_ordinary *ord_map, location_t loc) 1179 { 1180 return ((loc - ord_map->start_location) 1181 >> ord_map->m_column_and_range_bits) + ord_map->to_line; 1182 } 1183 1184 /* Convert a map and location_t to source column number. */ 1185 inline linenum_type 1186 SOURCE_COLUMN (const line_map_ordinary *ord_map, location_t loc) 1187 { 1188 return ((loc - ord_map->start_location) 1189 & ((1 << ord_map->m_column_and_range_bits) - 1)) >> ord_map->m_range_bits; 1190 } 1191 1192 1193 inline location_t 1194 linemap_included_from (const line_map_ordinary *ord_map) 1195 { 1196 return ord_map->included_from; 1197 } 1198 1199 /* The linemap containing the included-from location of MAP. */ 1200 const line_map_ordinary *linemap_included_from_linemap 1201 (line_maps *set, const line_map_ordinary *map); 1202 1203 /* True if the map is at the bottom of the include stack. */ 1204 1205 inline bool 1206 MAIN_FILE_P (const line_map_ordinary *ord_map) 1207 { 1208 return ord_map->included_from == 0; 1209 } 1210 1211 /* Encode and return a location_t from a column number. The 1212 source line considered is the last source line used to call 1213 linemap_line_start, i.e, the last source line which a location was 1214 encoded from. */ 1215 extern location_t 1216 linemap_position_for_column (struct line_maps *, unsigned int); 1217 1218 /* Encode and return a source location from a given line and 1219 column. */ 1220 location_t 1221 linemap_position_for_line_and_column (line_maps *set, 1222 const line_map_ordinary *, 1223 linenum_type, unsigned int); 1224 1225 /* Encode and return a location_t starting from location LOC and 1226 shifting it by OFFSET columns. This function does not support 1227 virtual locations. */ 1228 location_t 1229 linemap_position_for_loc_and_offset (struct line_maps *set, 1230 location_t loc, 1231 unsigned int offset); 1232 1233 /* Return the file this map is for. */ 1234 inline const char * 1235 LINEMAP_FILE (const line_map_ordinary *ord_map) 1236 { 1237 return ord_map->to_file; 1238 } 1239 1240 /* Return the line number this map started encoding location from. */ 1241 inline linenum_type 1242 LINEMAP_LINE (const line_map_ordinary *ord_map) 1243 { 1244 return ord_map->to_line; 1245 } 1246 1247 /* Return a positive value if map encodes locations from a system 1248 header, 0 otherwise. Returns 1 if MAP encodes locations in a 1249 system header and 2 if it encodes locations in a C system header 1250 that therefore needs to be extern "C" protected in C++. */ 1251 inline unsigned char 1252 LINEMAP_SYSP (const line_map_ordinary *ord_map) 1253 { 1254 return ord_map->sysp; 1255 } 1256 1257 /* Return a positive value if PRE denotes the location of a token that 1258 comes before the token of POST, 0 if PRE denotes the location of 1259 the same token as the token for POST, and a negative value 1260 otherwise. */ 1261 int linemap_compare_locations (struct line_maps *set, 1262 location_t pre, 1263 location_t post); 1264 1265 /* Return TRUE if LOC_A denotes the location a token that comes 1266 topogically before the token denoted by location LOC_B, or if they 1267 are equal. */ 1268 inline bool 1269 linemap_location_before_p (struct line_maps *set, 1270 location_t loc_a, 1271 location_t loc_b) 1272 { 1273 return linemap_compare_locations (set, loc_a, loc_b) >= 0; 1274 } 1275 1276 typedef struct 1277 { 1278 /* The name of the source file involved. */ 1279 const char *file; 1280 1281 /* The line-location in the source file. */ 1282 int line; 1283 1284 int column; 1285 1286 void *data; 1287 1288 /* In a system header?. */ 1289 bool sysp; 1290 } expanded_location; 1291 1292 class range_label; 1293 1294 /* A hint to diagnostic_show_locus on how to print a source range within a 1295 rich_location. 1296 1297 Typically this is SHOW_RANGE_WITH_CARET for the 0th range, and 1298 SHOW_RANGE_WITHOUT_CARET for subsequent ranges, 1299 but the Fortran frontend uses SHOW_RANGE_WITH_CARET repeatedly for 1300 printing things like: 1301 1302 x = x + y 1303 1 2 1304 Error: Shapes for operands at (1) and (2) are not conformable 1305 1306 where "1" and "2" are notionally carets. */ 1307 1308 enum range_display_kind 1309 { 1310 /* Show the pertinent source line(s), the caret, and underline(s). */ 1311 SHOW_RANGE_WITH_CARET, 1312 1313 /* Show the pertinent source line(s) and underline(s), but don't 1314 show the caret (just an underline). */ 1315 SHOW_RANGE_WITHOUT_CARET, 1316 1317 /* Just show the source lines; don't show the range itself. 1318 This is for use when displaying some line-insertion fix-it hints (for 1319 showing the user context on the change, for when it doesn't make sense 1320 to highlight the first column on the next line). */ 1321 SHOW_LINES_WITHOUT_RANGE 1322 }; 1323 1324 /* A location within a rich_location: a caret&range, with 1325 the caret potentially flagged for display, and an optional 1326 label. */ 1327 1328 struct location_range 1329 { 1330 location_t m_loc; 1331 1332 enum range_display_kind m_range_display_kind; 1333 1334 /* If non-NULL, the label for this range. */ 1335 const range_label *m_label; 1336 }; 1337 1338 /* A partially-embedded vec for use within rich_location for storing 1339 ranges and fix-it hints. 1340 1341 Elements [0..NUM_EMBEDDED) are allocated within m_embed, after 1342 that they are within the dynamically-allocated m_extra. 1343 1344 This allows for static allocation in the common case, whilst 1345 supporting the rarer case of an arbitrary number of elements. 1346 1347 Dynamic allocation is not performed unless it's needed. */ 1348 1349 template <typename T, int NUM_EMBEDDED> 1350 class semi_embedded_vec 1351 { 1352 public: 1353 semi_embedded_vec (); 1354 ~semi_embedded_vec (); 1355 1356 unsigned int count () const { return m_num; } 1357 T& operator[] (int idx); 1358 const T& operator[] (int idx) const; 1359 1360 void push (const T&); 1361 void truncate (int len); 1362 1363 private: 1364 int m_num; 1365 T m_embedded[NUM_EMBEDDED]; 1366 int m_alloc; 1367 T *m_extra; 1368 }; 1369 1370 /* Constructor for semi_embedded_vec. In particular, no dynamic allocation 1371 is done. */ 1372 1373 template <typename T, int NUM_EMBEDDED> 1374 semi_embedded_vec<T, NUM_EMBEDDED>::semi_embedded_vec () 1375 : m_num (0), m_alloc (0), m_extra (NULL) 1376 { 1377 } 1378 1379 /* semi_embedded_vec's dtor. Release any dynamically-allocated memory. */ 1380 1381 template <typename T, int NUM_EMBEDDED> 1382 semi_embedded_vec<T, NUM_EMBEDDED>::~semi_embedded_vec () 1383 { 1384 XDELETEVEC (m_extra); 1385 } 1386 1387 /* Look up element IDX, mutably. */ 1388 1389 template <typename T, int NUM_EMBEDDED> 1390 T& 1391 semi_embedded_vec<T, NUM_EMBEDDED>::operator[] (int idx) 1392 { 1393 linemap_assert (idx < m_num); 1394 if (idx < NUM_EMBEDDED) 1395 return m_embedded[idx]; 1396 else 1397 { 1398 linemap_assert (m_extra != NULL); 1399 return m_extra[idx - NUM_EMBEDDED]; 1400 } 1401 } 1402 1403 /* Look up element IDX (const). */ 1404 1405 template <typename T, int NUM_EMBEDDED> 1406 const T& 1407 semi_embedded_vec<T, NUM_EMBEDDED>::operator[] (int idx) const 1408 { 1409 linemap_assert (idx < m_num); 1410 if (idx < NUM_EMBEDDED) 1411 return m_embedded[idx]; 1412 else 1413 { 1414 linemap_assert (m_extra != NULL); 1415 return m_extra[idx - NUM_EMBEDDED]; 1416 } 1417 } 1418 1419 /* Append VALUE to the end of the semi_embedded_vec. */ 1420 1421 template <typename T, int NUM_EMBEDDED> 1422 void 1423 semi_embedded_vec<T, NUM_EMBEDDED>::push (const T& value) 1424 { 1425 int idx = m_num++; 1426 if (idx < NUM_EMBEDDED) 1427 m_embedded[idx] = value; 1428 else 1429 { 1430 /* Offset "idx" to be an index within m_extra. */ 1431 idx -= NUM_EMBEDDED; 1432 if (NULL == m_extra) 1433 { 1434 linemap_assert (m_alloc == 0); 1435 m_alloc = 16; 1436 m_extra = XNEWVEC (T, m_alloc); 1437 } 1438 else if (idx >= m_alloc) 1439 { 1440 linemap_assert (m_alloc > 0); 1441 m_alloc *= 2; 1442 m_extra = XRESIZEVEC (T, m_extra, m_alloc); 1443 } 1444 linemap_assert (m_extra); 1445 linemap_assert (idx < m_alloc); 1446 m_extra[idx] = value; 1447 } 1448 } 1449 1450 /* Truncate to length LEN. No deallocation is performed. */ 1451 1452 template <typename T, int NUM_EMBEDDED> 1453 void 1454 semi_embedded_vec<T, NUM_EMBEDDED>::truncate (int len) 1455 { 1456 linemap_assert (len <= m_num); 1457 m_num = len; 1458 } 1459 1460 class fixit_hint; 1461 1462 /* A "rich" source code location, for use when printing diagnostics. 1463 A rich_location has one or more carets&ranges, where the carets 1464 are optional. These are referred to as "ranges" from here. 1465 Typically the zeroth range has a caret; other ranges sometimes 1466 have carets. 1467 1468 The "primary" location of a rich_location is the caret of range 0, 1469 used for determining the line/column when printing diagnostic 1470 text, such as: 1471 1472 some-file.c:3:1: error: ...etc... 1473 1474 Additional ranges may be added to help the user identify other 1475 pertinent clauses in a diagnostic. 1476 1477 Ranges can (optionally) be given labels via class range_label. 1478 1479 rich_location instances are intended to be allocated on the stack 1480 when generating diagnostics, and to be short-lived. 1481 1482 Examples of rich locations 1483 -------------------------- 1484 1485 Example A 1486 ********* 1487 int i = "foo"; 1488 ^ 1489 This "rich" location is simply a single range (range 0), with 1490 caret = start = finish at the given point. 1491 1492 Example B 1493 ********* 1494 a = (foo && bar) 1495 ~~~~~^~~~~~~ 1496 This rich location has a single range (range 0), with the caret 1497 at the first "&", and the start/finish at the parentheses. 1498 Compare with example C below. 1499 1500 Example C 1501 ********* 1502 a = (foo && bar) 1503 ~~~ ^~ ~~~ 1504 This rich location has three ranges: 1505 - Range 0 has its caret and start location at the first "&" and 1506 end at the second "&. 1507 - Range 1 has its start and finish at the "f" and "o" of "foo"; 1508 the caret is not flagged for display, but is perhaps at the "f" 1509 of "foo". 1510 - Similarly, range 2 has its start and finish at the "b" and "r" of 1511 "bar"; the caret is not flagged for display, but is perhaps at the 1512 "b" of "bar". 1513 Compare with example B above. 1514 1515 Example D (Fortran frontend) 1516 **************************** 1517 x = x + y 1518 1 2 1519 This rich location has range 0 at "1", and range 1 at "2". 1520 Both are flagged for caret display. Both ranges have start/finish 1521 equal to their caret point. The frontend overrides the diagnostic 1522 context's default caret character for these ranges. 1523 1524 Example E (range labels) 1525 ************************ 1526 printf ("arg0: %i arg1: %s arg2: %i", 1527 ^~ 1528 | 1529 const char * 1530 100, 101, 102); 1531 ~~~ 1532 | 1533 int 1534 This rich location has two ranges: 1535 - range 0 is at the "%s" with start = caret = "%" and finish at 1536 the "s". It has a range_label ("const char *"). 1537 - range 1 has start/finish covering the "101" and is not flagged for 1538 caret printing. The caret is at the start of "101", where its 1539 range_label is printed ("int"). 1540 1541 Fix-it hints 1542 ------------ 1543 1544 Rich locations can also contain "fix-it hints", giving suggestions 1545 for the user on how to edit their code to fix a problem. These 1546 can be expressed as insertions, replacements, and removals of text. 1547 The edits by default are relative to the zeroth range within the 1548 rich_location, but optionally they can be expressed relative to 1549 other locations (using various overloaded methods of the form 1550 rich_location::add_fixit_*). 1551 1552 For example: 1553 1554 Example F: fix-it hint: insert_before 1555 ************************************* 1556 ptr = arr[0]; 1557 ^~~~~~ 1558 & 1559 This rich location has a single range (range 0) covering "arr[0]", 1560 with the caret at the start. The rich location has a single 1561 insertion fix-it hint, inserted before range 0, added via 1562 richloc.add_fixit_insert_before ("&"); 1563 1564 Example G: multiple fix-it hints: insert_before and insert_after 1565 **************************************************************** 1566 #define FN(ARG0, ARG1, ARG2) fn(ARG0, ARG1, ARG2) 1567 ^~~~ ^~~~ ^~~~ 1568 ( ) ( ) ( ) 1569 This rich location has three ranges, covering "arg0", "arg1", 1570 and "arg2", all with caret-printing enabled. 1571 The rich location has 6 insertion fix-it hints: each arg 1572 has a pair of insertion fix-it hints, suggesting wrapping 1573 them with parentheses: one a '(' inserted before, 1574 the other a ')' inserted after, added via 1575 richloc.add_fixit_insert_before (LOC, "("); 1576 and 1577 richloc.add_fixit_insert_after (LOC, ")"); 1578 1579 Example H: fix-it hint: removal 1580 ******************************* 1581 struct s {int i};; 1582 ^ 1583 - 1584 This rich location has a single range at the stray trailing 1585 semicolon, along with a single removal fix-it hint, covering 1586 the same range, added via: 1587 richloc.add_fixit_remove (); 1588 1589 Example I: fix-it hint: replace 1590 ******************************* 1591 c = s.colour; 1592 ^~~~~~ 1593 color 1594 This rich location has a single range (range 0) covering "colour", 1595 and a single "replace" fix-it hint, covering the same range, 1596 added via 1597 richloc.add_fixit_replace ("color"); 1598 1599 Example J: fix-it hint: line insertion 1600 ************************************** 1601 1602 3 | #include <stddef.h> 1603 + |+#include <stdio.h> 1604 4 | int the_next_line; 1605 1606 This rich location has a single range at line 4 column 1, marked 1607 with SHOW_LINES_WITHOUT_RANGE (to avoid printing a meaningless caret 1608 on the "i" of int). It has a insertion fix-it hint of the string 1609 "#include <stdio.h>\n". 1610 1611 Adding a fix-it hint can fail: for example, attempts to insert content 1612 at the transition between two line maps may fail due to there being no 1613 location_t value to express the new location. 1614 1615 Attempts to add a fix-it hint within a macro expansion will fail. 1616 1617 There is only limited support for newline characters in fix-it hints: 1618 only hints with newlines which insert an entire new line are permitted, 1619 inserting at the start of a line, and finishing with a newline 1620 (with no interior newline characters). Other attempts to add 1621 fix-it hints containing newline characters will fail. 1622 Similarly, attempts to delete or replace a range *affecting* multiple 1623 lines will fail. 1624 1625 The rich_location API handles these failures gracefully, so that 1626 diagnostics can attempt to add fix-it hints without each needing 1627 extensive checking. 1628 1629 Fix-it hints within a rich_location are "atomic": if any hints can't 1630 be applied, none of them will be (tracked by the m_seen_impossible_fixit 1631 flag), and no fix-its hints will be displayed for that rich_location. 1632 This implies that diagnostic messages need to be worded in such a way 1633 that they make sense whether or not the fix-it hints are displayed, 1634 or that richloc.seen_impossible_fixit_p () should be checked before 1635 issuing the diagnostics. */ 1636 1637 class rich_location 1638 { 1639 public: 1640 /* Constructors. */ 1641 1642 /* Constructing from a location. */ 1643 rich_location (line_maps *set, location_t loc, 1644 const range_label *label = NULL); 1645 1646 /* Destructor. */ 1647 ~rich_location (); 1648 1649 /* Accessors. */ 1650 location_t get_loc () const { return get_loc (0); } 1651 location_t get_loc (unsigned int idx) const; 1652 1653 void 1654 add_range (location_t loc, 1655 enum range_display_kind range_display_kind 1656 = SHOW_RANGE_WITHOUT_CARET, 1657 const range_label *label = NULL); 1658 1659 void 1660 set_range (unsigned int idx, location_t loc, 1661 enum range_display_kind range_display_kind); 1662 1663 unsigned int get_num_locations () const { return m_ranges.count (); } 1664 1665 const location_range *get_range (unsigned int idx) const; 1666 location_range *get_range (unsigned int idx); 1667 1668 expanded_location get_expanded_location (unsigned int idx); 1669 1670 void 1671 override_column (int column); 1672 1673 /* Fix-it hints. */ 1674 1675 /* Methods for adding insertion fix-it hints. */ 1676 1677 /* Suggest inserting NEW_CONTENT immediately before the primary 1678 range's start. */ 1679 void 1680 add_fixit_insert_before (const char *new_content); 1681 1682 /* Suggest inserting NEW_CONTENT immediately before the start of WHERE. */ 1683 void 1684 add_fixit_insert_before (location_t where, 1685 const char *new_content); 1686 1687 /* Suggest inserting NEW_CONTENT immediately after the end of the primary 1688 range. */ 1689 void 1690 add_fixit_insert_after (const char *new_content); 1691 1692 /* Suggest inserting NEW_CONTENT immediately after the end of WHERE. */ 1693 void 1694 add_fixit_insert_after (location_t where, 1695 const char *new_content); 1696 1697 /* Methods for adding removal fix-it hints. */ 1698 1699 /* Suggest removing the content covered by range 0. */ 1700 void 1701 add_fixit_remove (); 1702 1703 /* Suggest removing the content covered between the start and finish 1704 of WHERE. */ 1705 void 1706 add_fixit_remove (location_t where); 1707 1708 /* Suggest removing the content covered by SRC_RANGE. */ 1709 void 1710 add_fixit_remove (source_range src_range); 1711 1712 /* Methods for adding "replace" fix-it hints. */ 1713 1714 /* Suggest replacing the content covered by range 0 with NEW_CONTENT. */ 1715 void 1716 add_fixit_replace (const char *new_content); 1717 1718 /* Suggest replacing the content between the start and finish of 1719 WHERE with NEW_CONTENT. */ 1720 void 1721 add_fixit_replace (location_t where, 1722 const char *new_content); 1723 1724 /* Suggest replacing the content covered by SRC_RANGE with 1725 NEW_CONTENT. */ 1726 void 1727 add_fixit_replace (source_range src_range, 1728 const char *new_content); 1729 1730 unsigned int get_num_fixit_hints () const { return m_fixit_hints.count (); } 1731 fixit_hint *get_fixit_hint (int idx) const { return m_fixit_hints[idx]; } 1732 fixit_hint *get_last_fixit_hint () const; 1733 bool seen_impossible_fixit_p () const { return m_seen_impossible_fixit; } 1734 1735 /* Set this if the fix-it hints are not suitable to be 1736 automatically applied. 1737 1738 For example, if you are suggesting more than one 1739 mutually exclusive solution to a problem, then 1740 it doesn't make sense to apply all of the solutions; 1741 manual intervention is required. 1742 1743 If set, then the fix-it hints in the rich_location will 1744 be printed, but will not be added to generated patches, 1745 or affect the modified version of the file. */ 1746 void fixits_cannot_be_auto_applied () 1747 { 1748 m_fixits_cannot_be_auto_applied = true; 1749 } 1750 1751 bool fixits_can_be_auto_applied_p () const 1752 { 1753 return !m_fixits_cannot_be_auto_applied; 1754 } 1755 1756 private: 1757 bool reject_impossible_fixit (location_t where); 1758 void stop_supporting_fixits (); 1759 void maybe_add_fixit (location_t start, 1760 location_t next_loc, 1761 const char *new_content); 1762 1763 public: 1764 static const int STATICALLY_ALLOCATED_RANGES = 3; 1765 1766 protected: 1767 line_maps *m_line_table; 1768 semi_embedded_vec <location_range, STATICALLY_ALLOCATED_RANGES> m_ranges; 1769 1770 int m_column_override; 1771 1772 bool m_have_expanded_location; 1773 expanded_location m_expanded_location; 1774 1775 static const int MAX_STATIC_FIXIT_HINTS = 2; 1776 semi_embedded_vec <fixit_hint *, MAX_STATIC_FIXIT_HINTS> m_fixit_hints; 1777 1778 bool m_seen_impossible_fixit; 1779 bool m_fixits_cannot_be_auto_applied; 1780 }; 1781 1782 /* A struct for the result of range_label::get_text: a NUL-terminated buffer 1783 of localized text, and a flag to determine if the caller should "free" the 1784 buffer. */ 1785 1786 struct label_text 1787 { 1788 label_text () 1789 : m_buffer (NULL), m_caller_owned (false) 1790 {} 1791 1792 label_text (char *buffer, bool caller_owned) 1793 : m_buffer (buffer), m_caller_owned (caller_owned) 1794 {} 1795 1796 void maybe_free () 1797 { 1798 if (m_caller_owned) 1799 free (m_buffer); 1800 } 1801 1802 char *m_buffer; 1803 bool m_caller_owned; 1804 }; 1805 1806 /* Abstract base class for labelling a range within a rich_location 1807 (e.g. for labelling expressions with their type). 1808 1809 Generating the text could require non-trivial work, so this work 1810 is delayed (via the "get_text" virtual function) until the diagnostic 1811 printing code "knows" it needs it, thus avoiding doing it e.g. for 1812 warnings that are filtered by command-line flags. This virtual 1813 function also isolates libcpp and the diagnostics subsystem from 1814 the front-end and middle-end-specific code for generating the text 1815 for the labels. 1816 1817 Like the rich_location instances they annotate, range_label instances 1818 are intended to be allocated on the stack when generating diagnostics, 1819 and to be short-lived. */ 1820 1821 class range_label 1822 { 1823 public: 1824 virtual ~range_label () {} 1825 1826 /* Get localized text for the label. 1827 The RANGE_IDX is provided, allowing for range_label instances to be 1828 shared by multiple ranges if need be (the "flyweight" design pattern). */ 1829 virtual label_text get_text (unsigned range_idx) const = 0; 1830 }; 1831 1832 /* A fix-it hint: a suggested insertion, replacement, or deletion of text. 1833 We handle these three types of edit with one class, by representing 1834 them as replacement of a half-open range: 1835 [start, next_loc) 1836 Insertions have start == next_loc: "replace" the empty string at the 1837 start location with the new string. 1838 Deletions are replacement with the empty string. 1839 1840 There is only limited support for newline characters in fix-it hints 1841 as noted above in the comment for class rich_location. 1842 A fixit_hint instance can have at most one newline character; if 1843 present, the newline character must be the final character of 1844 the content (preventing e.g. fix-its that split a pre-existing line). */ 1845 1846 class fixit_hint 1847 { 1848 public: 1849 fixit_hint (location_t start, 1850 location_t next_loc, 1851 const char *new_content); 1852 ~fixit_hint () { free (m_bytes); } 1853 1854 bool affects_line_p (const char *file, int line) const; 1855 location_t get_start_loc () const { return m_start; } 1856 location_t get_next_loc () const { return m_next_loc; } 1857 bool maybe_append (location_t start, 1858 location_t next_loc, 1859 const char *new_content); 1860 1861 const char *get_string () const { return m_bytes; } 1862 size_t get_length () const { return m_len; } 1863 1864 bool insertion_p () const { return m_start == m_next_loc; } 1865 1866 bool ends_with_newline_p () const; 1867 1868 private: 1869 /* We don't use source_range here since, unlike most places, 1870 this is a half-open/half-closed range: 1871 [start, next_loc) 1872 so that we can support insertion via start == next_loc. */ 1873 location_t m_start; 1874 location_t m_next_loc; 1875 char *m_bytes; 1876 size_t m_len; 1877 }; 1878 1879 1880 /* This is enum is used by the function linemap_resolve_location 1881 below. The meaning of the values is explained in the comment of 1882 that function. */ 1883 enum location_resolution_kind 1884 { 1885 LRK_MACRO_EXPANSION_POINT, 1886 LRK_SPELLING_LOCATION, 1887 LRK_MACRO_DEFINITION_LOCATION 1888 }; 1889 1890 /* Resolve a virtual location into either a spelling location, an 1891 expansion point location or a token argument replacement point 1892 location. Return the map that encodes the virtual location as well 1893 as the resolved location. 1894 1895 If LOC is *NOT* the location of a token resulting from the 1896 expansion of a macro, then the parameter LRK (which stands for 1897 Location Resolution Kind) is ignored and the resulting location 1898 just equals the one given in argument. 1899 1900 Now if LOC *IS* the location of a token resulting from the 1901 expansion of a macro, this is what happens. 1902 1903 * If LRK is set to LRK_MACRO_EXPANSION_POINT 1904 ------------------------------- 1905 1906 The virtual location is resolved to the first macro expansion point 1907 that led to this macro expansion. 1908 1909 * If LRK is set to LRK_SPELLING_LOCATION 1910 ------------------------------------- 1911 1912 The virtual location is resolved to the locus where the token has 1913 been spelled in the source. This can follow through all the macro 1914 expansions that led to the token. 1915 1916 * If LRK is set to LRK_MACRO_DEFINITION_LOCATION 1917 -------------------------------------- 1918 1919 The virtual location is resolved to the locus of the token in the 1920 context of the macro definition. 1921 1922 If LOC is the locus of a token that is an argument of a 1923 function-like macro [replacing a parameter in the replacement list 1924 of the macro] the virtual location is resolved to the locus of the 1925 parameter that is replaced, in the context of the definition of the 1926 macro. 1927 1928 If LOC is the locus of a token that is not an argument of a 1929 function-like macro, then the function behaves as if LRK was set to 1930 LRK_SPELLING_LOCATION. 1931 1932 If LOC_MAP is not NULL, *LOC_MAP is set to the map encoding the 1933 returned location. Note that if the returned location wasn't originally 1934 encoded by a map, the *MAP is set to NULL. This can happen if LOC 1935 resolves to a location reserved for the client code, like 1936 UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC. */ 1937 1938 location_t linemap_resolve_location (struct line_maps *, 1939 location_t loc, 1940 enum location_resolution_kind lrk, 1941 const line_map_ordinary **loc_map); 1942 1943 /* Suppose that LOC is the virtual location of a token coming from the 1944 expansion of a macro M. This function then steps up to get the 1945 location L of the point where M got expanded. If L is a spelling 1946 location inside a macro expansion M', then this function returns 1947 the point where M' was expanded. LOC_MAP is an output parameter. 1948 When non-NULL, *LOC_MAP is set to the map of the returned 1949 location. */ 1950 location_t linemap_unwind_toward_expansion (struct line_maps *, 1951 location_t loc, 1952 const struct line_map **loc_map); 1953 1954 /* If LOC is the virtual location of a token coming from the expansion 1955 of a macro M and if its spelling location is reserved (e.g, a 1956 location for a built-in token), then this function unwinds (using 1957 linemap_unwind_toward_expansion) the location until a location that 1958 is not reserved and is not in a system header is reached. In other 1959 words, this unwinds the reserved location until a location that is 1960 in real source code is reached. 1961 1962 Otherwise, if the spelling location for LOC is not reserved or if 1963 LOC doesn't come from the expansion of a macro, the function 1964 returns LOC as is and *MAP is not touched. 1965 1966 *MAP is set to the map of the returned location if the later is 1967 different from LOC. */ 1968 location_t linemap_unwind_to_first_non_reserved_loc (struct line_maps *, 1969 location_t loc, 1970 const struct line_map **map); 1971 1972 /* Expand source code location LOC and return a user readable source 1973 code location. LOC must be a spelling (non-virtual) location. If 1974 it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source 1975 location is returned. */ 1976 expanded_location linemap_expand_location (struct line_maps *, 1977 const struct line_map *, 1978 location_t loc); 1979 1980 /* Statistics about maps allocation and usage as returned by 1981 linemap_get_statistics. */ 1982 struct linemap_stats 1983 { 1984 long num_ordinary_maps_allocated; 1985 long num_ordinary_maps_used; 1986 long ordinary_maps_allocated_size; 1987 long ordinary_maps_used_size; 1988 long num_expanded_macros; 1989 long num_macro_tokens; 1990 long num_macro_maps_used; 1991 long macro_maps_allocated_size; 1992 long macro_maps_used_size; 1993 long macro_maps_locations_size; 1994 long duplicated_macro_maps_locations_size; 1995 long adhoc_table_size; 1996 long adhoc_table_entries_used; 1997 }; 1998 1999 /* Return the highest location emitted for a given file for which 2000 there is a line map in SET. FILE_NAME is the file name to 2001 consider. If the function returns TRUE, *LOC is set to the highest 2002 location emitted for that file. */ 2003 bool linemap_get_file_highest_location (struct line_maps * set, 2004 const char *file_name, 2005 location_t *loc); 2006 2007 /* Compute and return statistics about the memory consumption of some 2008 parts of the line table SET. */ 2009 void linemap_get_statistics (struct line_maps *, struct linemap_stats *); 2010 2011 /* Dump debugging information about source location LOC into the file 2012 stream STREAM. SET is the line map set LOC comes from. */ 2013 void linemap_dump_location (struct line_maps *, location_t, FILE *); 2014 2015 /* Dump line map at index IX in line table SET to STREAM. If STREAM 2016 is NULL, use stderr. IS_MACRO is true if the caller wants to 2017 dump a macro map, false otherwise. */ 2018 void linemap_dump (FILE *, struct line_maps *, unsigned, bool); 2019 2020 /* Dump line table SET to STREAM. If STREAM is NULL, stderr is used. 2021 NUM_ORDINARY specifies how many ordinary maps to dump. NUM_MACRO 2022 specifies how many macro maps to dump. */ 2023 void line_table_dump (FILE *, struct line_maps *, unsigned int, unsigned int); 2024 2025 /* An enum for distinguishing the various parts within a location_t. */ 2026 2027 enum location_aspect 2028 { 2029 LOCATION_ASPECT_CARET, 2030 LOCATION_ASPECT_START, 2031 LOCATION_ASPECT_FINISH 2032 }; 2033 2034 /* The rich_location class requires a way to expand location_t instances. 2035 We would directly use expand_location_to_spelling_point, which is 2036 implemented in gcc/input.c, but we also need to use it for rich_location 2037 within genmatch.c. 2038 Hence we require client code of libcpp to implement the following 2039 symbol. */ 2040 extern expanded_location 2041 linemap_client_expand_location_to_spelling_point (location_t, 2042 enum location_aspect); 2043 2044 #endif /* !LIBCPP_LINE_MAP_H */ 2045