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