On Wed, Jul 18, 2018 at 8:53 AM Alexandre Oliva <ol...@gnu.org> wrote: > > This patch is a rewrite of an earlier patch submitted at > https://gcc.gnu.org/ml/gcc-patches/2012-11/msg02340.html > > With -gnateS, the Ada compiler sets itself up to output discriminators > for different instantiations of generics, but the middle and back ends > have lacked support for that. This patch introduces the missing bits, > translating the GNAT-internal representation of the instance map to an > instance_table that maps ordinary line-map indices to instance > discriminators. > > Instance discriminators are not compatible with LTO, in that the > instance mapping is not preserved in LTO dumps. There are no plans to > preserve discriminators in them.
Because...? I think that's a sentence that should cause me to say "no" to this patch ;) Is it possible to merge the BB discriminator stuff with the new framework? > This patch (minus whitespace changes and tests) was regstrapped on > x86_64-linux-gnu. The final form of the patch was tested with a > non-bootstrap build, and a single-test check-gnat run. Ok to install? > > > From: Olivier Hainque <hain...@adacore.com> > for libcpp/ChangeLog > > * include/line-map.h (ORDINARY_MAP_INDEX): New. > > for gcc/ChangeLog > > * einput.c: New file. Allow associating "line context" > extension data to instruction location info, for sets of > locations covered by an ordinary line_map structure. > * einput.h: Likewise. > * Makefile.in (OBJS): Add einput.o. > * input.c (expand_location_1): On request, provide pointer to the > line map that was used to resolve the input location. > (map_expand_location): New function. Same as expand_location, > also providing the map from which the input location was resolved. > (expand_location, expand_location_to_spelling_point): Adjust calls > to expand_location_1. > (linemap_client_expand_location_to_spelling_point): Likewise. > * input.h (map_expand_location): Declare. > * emit-rtl.c (insn_location): Handle a location_lc* argument. > * rtl.h (insn_location): Adjust prototype. > * print-rtl.c (print_rtx): Adjust call to insn_location. > * modulo-sched.c (dump_insn_location): Likewise. > * tree-inline.c (copy_bb): Copy discriminator field as well. > * flag-types.h (loc_discriminator_type): New enum, allowing BB > or INSTANCE_ID discriminators. > * common.opt (loc_discriminator_kind): New variable, conveying the > kinf of discriminator we want to see emited with source locations. > * final.c (bb_discriminator, last_bb_discriminator): New statics, > to track basic block discriminators. > (final_start_function_1): Initialize them. > (final_scan_insn_1): On NOTE_INSN_BASIC_BLOCK, track > bb_discriminator. > (notice_source_line): If INSN_HAS_LOCATION, update current > discriminator from BB or INSTANCE_ID depending on the kind we're > requested to convey. When deciding to emit, account for both > possible kinds of discriminators. > > for gcc/ada > > * trans.c (gigi): When requested so, allocate and populate > the gcc table controlling the emission of per-instance debug > info. > > From: Alexandre Oliva <ol...@adacore.com>, Olivier Hainque > <hain...@adacore.com> > for gcc/testsuite/ChangeLog > > * gnat.dg/dinst.adb: New. > * gnat.dg/dinst_pkg.ads, gnat.dg/dinst_pkg.adb: New. > --- > gcc/Makefile.in | 1 + > gcc/ada/gcc-interface/trans.c | 10 ++++++ > gcc/common.opt | 12 ++++++++ > gcc/einput.c | 55 > +++++++++++++++++++++++++++++++++++ > gcc/einput.h | 50 ++++++++++++++++++++++++++++++++ > gcc/emit-rtl.c | 11 +++++-- > gcc/final.c | 29 +++++++++++++++--- > gcc/flag-types.h | 14 +++++++++ > gcc/input.c | 32 +++++++++++++++++--- > gcc/input.h | 2 + > gcc/modulo-sched.c | 2 + > gcc/print-rtl.c | 2 + > gcc/rtl.h | 3 +- > gcc/testsuite/gnat.dg/dinst.adb | 20 +++++++++++++ > gcc/testsuite/gnat.dg/dinst_pkg.adb | 7 ++++ > gcc/testsuite/gnat.dg/dinst_pkg.ads | 4 +++ > gcc/tree-inline.c | 2 + > libcpp/include/line-map.h | 8 +++++ > 18 files changed, 247 insertions(+), 17 deletions(-) > create mode 100644 gcc/einput.c > create mode 100644 gcc/einput.h > create mode 100644 gcc/testsuite/gnat.dg/dinst.adb > create mode 100644 gcc/testsuite/gnat.dg/dinst_pkg.adb > create mode 100644 gcc/testsuite/gnat.dg/dinst_pkg.ads > > diff --git a/gcc/Makefile.in b/gcc/Makefile.in > index 2a05a66ea9b87..f9a9fe8726b18 100644 > --- a/gcc/Makefile.in > +++ b/gcc/Makefile.in > @@ -1285,6 +1285,7 @@ OBJS = \ > dwarf2cfi.o \ > dwarf2out.o \ > early-remat.o \ > + einput.o \ > emit-rtl.o \ > et-forest.o \ > except.o \ > diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c > index 31e098a0c707a..3ad3f83fd60f5 100644 > --- a/gcc/ada/gcc-interface/trans.c > +++ b/gcc/ada/gcc-interface/trans.c > @@ -45,6 +45,7 @@ > #include "tree-iterator.h" > #include "gimplify.h" > #include "opts.h" > +#include "einput.h" > #include "common/common-target.h" > #include "stringpool.h" > #include "attribs.h" > @@ -300,6 +301,12 @@ gigi (Node_Id gnat_root, > > type_annotate_only = (gigi_operating_mode == 1); > > + if (Generate_SCO_Instance_Table != 0) > + { > + loc_discriminator_kind = LOC_DISCRIMINATOR_INSTANCE_ID; > + instance_table = (int *) xcalloc (number_file, sizeof (int)); > + } > + > for (i = 0; i < number_file; i++) > { > /* Use the identifier table to make a permanent copy of the filename as > @@ -322,6 +329,9 @@ gigi (Node_Id gnat_root, > linemap_line_start (line_table, file_info_ptr[i].Num_Source_Lines, > 252); > linemap_position_for_column (line_table, 252 - 1); > linemap_add (line_table, LC_LEAVE, 0, NULL, 0); > + > + if (instance_table) > + instance_table[i] = file_info_ptr[i].Instance; > } > > gcc_assert (Nkind (gnat_root) == N_Compilation_Unit); > diff --git a/gcc/common.opt b/gcc/common.opt > index 4d031e81b09a2..b72ff1fd673e6 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -176,6 +176,18 @@ HOST_WIDE_INT function_entry_patch_area_start > Variable > enum dwarf_gnat_encodings gnat_encodings = DWARF_GNAT_ENCODINGS_DEFAULT > > +; Kind of discriminator information we associate with object code > +; locations in debug information. By default this is set to the basic > +; block discriminator, an arbitrary values that is guaranteed to be > +; distinct for each basic block associated with a given source > +; location. Language front-ends that support multiple instantiations > +; of a given source template (such as Ada with generics) may instead > +; provide instance identifiers, allowing external tools to > +; identify which instance a given object instruction comes from. > + > +Variable > +enum loc_discriminator_type loc_discriminator_kind = LOC_DISCRIMINATOR_BB > + > ; -dP causes the rtl to be emitted as a comment in assembly. > Variable > int flag_dump_rtl_in_asm > diff --git a/gcc/einput.c b/gcc/einput.c > new file mode 100644 > index 0000000000000..32768282a34ac > --- /dev/null > +++ b/gcc/einput.c > @@ -0,0 +1,55 @@ > +/* Data and functions implementing the input expansion extension services. > + Copyright (C) 2004-2014 Free Software Foundation, Inc. > + > +This file is part of GCC. > + > +GCC is free software; you can redistribute it and/or modify it under > +the terms of the GNU General Public License as published by the Free > +Software Foundation; either version 3, or (at your option) any later > +version. > + > +GCC is distributed in the hope that it will be useful, but WITHOUT ANY > +WARRANTY; without even the implied warranty of MERCHANTABILITY or > +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License > +for more details. > + > +You should have received a copy of the GNU General Public License > +along with GCC; see the file COPYING3. If not see > +<http://www.gnu.org/licenses/>. */ > + > +#include "config.h" > +#include "system.h" > +#include "coretypes.h" > +#include "intl.h" > +#include "input.h" > +#include "einput.h" > + > +/* Map from ordinary map index to instance id. > + See gcc/ada/trans.c for an example of how to fill it in. */ > + > +int *instance_table; > + > +/* Same as expand_location, filling line context information in addition. */ > + > +expanded_location > +context_expand_location (source_location loc, location_lc *lcp) > +{ > + const struct line_map *map; > + expanded_location xloc = map_expand_location (loc, /*pmap=*/&map); > + > + /* If an invalid LOC reaches here somehow or we don't have an instance > + table to query, assign a constant instance id. Otherwise, fetch the > + instance id associated with the map corresponding to the input LOC. */ > + > + if (map == NULL || instance_table == NULL) > + lcp->instance = 0; > + else > + { > + int map_index = ORDINARY_MAP_INDEX (linemap_check_ordinary (map), > + line_table); > + > + lcp->instance = instance_table [map_index]; > + } > + > + return xloc; > +} > diff --git a/gcc/einput.h b/gcc/einput.h > new file mode 100644 > index 0000000000000..099aead637492 > --- /dev/null > +++ b/gcc/einput.h > @@ -0,0 +1,50 @@ > +/* Extensions to the basic input location expansion services, using > + extra datastructures optionally filled by language front-ends. > + Copyright (C) 2017 Free Software Foundation, Inc. > + > +This file is part of GCC. > + > +GCC is free software; you can redistribute it and/or modify it under > +the terms of the GNU General Public License as published by the Free > +Software Foundation; either version 3, or (at your option) any later > +version. > + > +GCC is distributed in the hope that it will be useful, but WITHOUT ANY > +WARRANTY; without even the implied warranty of MERCHANTABILITY or > +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License > +for more details. > + > +You should have received a copy of the GNU General Public License > +along with GCC; see the file COPYING3. If not see > +<http://www.gnu.org/licenses/>. */ > + > +#ifndef GCC_EINPUT_H > +#define GCC_EINPUT_H > + > +#include "input.h" > + > +/* For languages that have the notion of instantiating a given > + template multiple times, different linemaps can be allocated for > + each instance, which are distinguished by an instance id. This > + table, which has the same indices as the ordinary linemaps in > + line_table, stores these instance ids. */ > + > +extern int *instance_table; > + > +/* Line context information: extra data associated with source *lines* (not > + individual source locations), filled by context_expand_location from extra > + tables that front-ends may provide by the time we reach the "final" > + pass. */ > + > +/* The line context information per se, filled by context_expand_location > + below from data found in the tables declared above. */ > + > +typedef struct location_lc { > + /* The instance id associated with the source line, if any. */ > + int instance; > +} location_lc; > + > +extern expanded_location context_expand_location (source_location loc, > + location_lc *lcp); > + > +#endif > diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c > index e4b070486e87e..64af8082c5ddc 100644 > --- a/gcc/emit-rtl.c > +++ b/gcc/emit-rtl.c > @@ -6567,11 +6567,16 @@ insn_file (const rtx_insn *insn) > return LOCATION_FILE (INSN_LOCATION (insn)); > } > > -/* Return expanded location of the statement that produced this insn. */ > +/* Return expanded location of the statement that produced INSN, and > + fill the associated line context information we have into LC if not > + NULL. */ > expanded_location > -insn_location (const rtx_insn *insn) > +insn_location (const rtx_insn *insn, location_lc *lcp) > { > - return expand_location (INSN_LOCATION (insn)); > + if (lcp == NULL) > + return expand_location (INSN_LOCATION (insn)); > + else > + return context_expand_location (INSN_LOCATION (insn), lcp); > } > > /* Return true if memory model MODEL requires a pre-operation (release-style) > diff --git a/gcc/final.c b/gcc/final.c > index 445a3fe938a67..b1266affbc108 100644 > --- a/gcc/final.c > +++ b/gcc/final.c > @@ -122,12 +122,20 @@ static int last_linenum; > /* Column number of last NOTE. */ > static int last_columnnum; > > -/* Last discriminator written to assembly. */ > +/* Discriminator written to assembly. */ > static int last_discriminator; > > -/* Discriminator of current block. */ > +/* Discriminator to be written to assembly for current instruction. > + Note: actual usage depends on loc_discriminator_kind setting. */ > static int discriminator; > > +/* Discriminator identifying current basic block among others sharing > + the same locus. */ > +static int bb_discriminator; > + > +/* Basic block discriminator for previous instruction. */ > +static int last_bb_discriminator; > + > /* Highest line number in current block. */ > static int high_block_linenum; > > @@ -1701,6 +1709,7 @@ final_start_function_1 (rtx_insn **firstp, FILE *file, > int *seen, > last_linenum = LOCATION_LINE (prologue_location); > last_columnnum = LOCATION_COLUMN (prologue_location); > last_discriminator = discriminator = 0; > + last_bb_discriminator = bb_discriminator = 0; > > high_block_linenum = high_function_linenum = last_linenum; > > @@ -2236,8 +2245,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int > optimize_p ATTRIBUTE_UNUSED, > if (targetm.asm_out.unwind_emit) > targetm.asm_out.unwind_emit (asm_out_file, insn); > > - discriminator = NOTE_BASIC_BLOCK (insn)->discriminator; > - > + bb_discriminator = NOTE_BASIC_BLOCK (insn)->discriminator; > break; > > case NOTE_INSN_EH_REGION_BEG: > @@ -3188,10 +3196,21 @@ notice_source_line (rtx_insn *insn, bool *is_stmt) > } > else if (INSN_HAS_LOCATION (insn)) > { > - expanded_location xloc = insn_location (insn); > + location_lc llc; > + expanded_location xloc = insn_location (insn, &llc); > filename = xloc.file; > linenum = xloc.line; > columnnum = xloc.column; > + > + switch (loc_discriminator_kind) > + { > + case LOC_DISCRIMINATOR_BB: > + discriminator = bb_discriminator; > + break; > + case LOC_DISCRIMINATOR_INSTANCE_ID: > + discriminator = llc.instance; > + break; > + } > } > else > { > diff --git a/gcc/flag-types.h b/gcc/flag-types.h > index 500f6638f36ac..15e80188ef040 100644 > --- a/gcc/flag-types.h > +++ b/gcc/flag-types.h > @@ -90,6 +90,20 @@ enum debug_struct_file > DINFO_STRUCT_FILE_ANY /* Debug structs defined in all files. */ > }; > > +/* Information stored in source location discriminators. */ > + > +enum loc_discriminator_type > +{ > + LOC_DISCRIMINATOR_BB, /* Basic block discriminator. > + Arbitrary, distinct values are set > + for each of the basic blocks that > + share a given source location. */ > + LOC_DISCRIMINATOR_INSTANCE_ID /* Instance identifier provided by a > + language front-end to differentiate > + instances of a given generic > + template. */ > +}; > + > /* Balance between GNAT encodings and standard DWARF to emit. */ > > enum dwarf_gnat_encodings > diff --git a/gcc/input.c b/gcc/input.c > index d65a82dc26eac..f5a17ebbdf239 100644 > --- a/gcc/input.c > +++ b/gcc/input.c > @@ -149,15 +149,19 @@ static const size_t fcache_line_record_size = 100; > location towards its expansion point) that is in real source > code. > > + If PMAP is non-null, *PMAP is set to designate the line map > + from which the location was resolved. > + > ASPECT controls which part of the location to use. */ > > static expanded_location > expand_location_1 (source_location loc, > bool expansion_point_p, > + const struct line_map **pmap, > enum location_aspect aspect) > { > expanded_location xloc; > - const line_map_ordinary *map; > + const line_map_ordinary *map = NULL; > enum location_resolution_kind lrk = LRK_MACRO_EXPANSION_POINT; > tree block = NULL; > > @@ -203,14 +207,16 @@ expand_location_1 (source_location loc, > { > source_location start = get_start (loc); > if (start != loc) > - return expand_location_1 (start, expansion_point_p, aspect); > + return expand_location_1 (start, expansion_point_p, NULL, > + aspect); > } > break; > case LOCATION_ASPECT_FINISH: > { > source_location finish = get_finish (loc); > if (finish != loc) > - return expand_location_1 (finish, expansion_point_p, aspect); > + return expand_location_1 (finish, expansion_point_p, NULL, > + aspect); > } > break; > } > @@ -221,6 +227,9 @@ expand_location_1 (source_location loc, > if (loc <= BUILTINS_LOCATION) > xloc.file = loc == UNKNOWN_LOCATION ? NULL : _("<built-in>"); > > + if (pmap) > + *pmap = map; > + > return xloc; > } > > @@ -802,7 +811,17 @@ is_location_from_builtin_token (source_location loc) > expanded_location > expand_location (source_location loc) > { > - return expand_location_1 (loc, /*expansion_point_p=*/true, > + return expand_location_1 (loc, /*expansion_point_p=*/true, /*pmap=*/NULL, > + LOCATION_ASPECT_CARET); > +} > + > +/* Same as expand_location, filling PMAP with the map that > + was used to resolve, if PMAP is not null. */ > + > +expanded_location > +map_expand_location (source_location loc, const struct line_map **pmap) > +{ > + return expand_location_1 (loc, /*expansion_point_p=*/true, /*pmap=*/pmap, > LOCATION_ASPECT_CARET); > } > > @@ -815,7 +834,7 @@ expand_location (source_location loc) > expanded_location > expand_location_to_spelling_point (source_location loc) > { > - return expand_location_1 (loc, /*expansion_point_p=*/false, > + return expand_location_1 (loc, /*expansion_point_p=*/false, /*pmap=*/NULL, > LOCATION_ASPECT_CARET); > } > > @@ -832,7 +851,8 @@ expanded_location > linemap_client_expand_location_to_spelling_point (source_location loc, > enum location_aspect aspect) > { > - return expand_location_1 (loc, /*expansion_point_p=*/false, aspect); > + return expand_location_1 (loc, /*expansion_point_p=*/false, /*pmap=*/NULL, > + aspect); > } > > > diff --git a/gcc/input.h b/gcc/input.h > index 4619663519a46..25cb8a94147cb 100644 > --- a/gcc/input.h > +++ b/gcc/input.h > @@ -37,6 +37,8 @@ extern GTY(()) struct line_maps *saved_line_table; > STATIC_ASSERT (BUILTINS_LOCATION < RESERVED_LOCATION_COUNT); > > extern bool is_location_from_builtin_token (source_location); > +extern expanded_location map_expand_location (source_location loc, > + const struct line_map **pmap); > extern expanded_location expand_location (source_location); > > /* A class capturing the bounds of a buffer, to allow for run-time > diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c > index 9a27365bfbc4e..1eb9362d31065 100644 > --- a/gcc/modulo-sched.c > +++ b/gcc/modulo-sched.c > @@ -1237,7 +1237,7 @@ dump_insn_location (rtx_insn *insn) > { > if (dump_file && INSN_HAS_LOCATION (insn)) > { > - expanded_location xloc = insn_location (insn); > + expanded_location xloc = insn_location (insn, NULL); > fprintf (dump_file, " %s:%i", xloc.file, xloc.line); > } > } > diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c > index 37c0d53fae276..0632bf0ec1a99 100644 > --- a/gcc/print-rtl.c > +++ b/gcc/print-rtl.c > @@ -397,7 +397,7 @@ rtx_writer::print_rtx_operand_code_i (const_rtx in_rtx, > int idx) > when there is no location information available. */ > if (INSN_HAS_LOCATION (in_insn)) > { > - expanded_location xloc = insn_location (in_insn); > + expanded_location xloc = insn_location (in_insn, NULL); > fprintf (m_outfile, " \"%s\":%i", xloc.file, xloc.line); > } > #endif > diff --git a/gcc/rtl.h b/gcc/rtl.h > index 565ce3abbe4e1..05c42fe515c39 100644 > --- a/gcc/rtl.h > +++ b/gcc/rtl.h > @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see > #endif /* GENERATOR_FILE */ > > #include "hard-reg-set.h" > +#include "einput.h" > > /* Value used by some passes to "recognize" noop moves as valid > instructions. */ > @@ -3285,7 +3286,7 @@ extern rtx_insn *prev_cc0_setter (rtx_insn *); > extern int insn_line (const rtx_insn *); > extern const char * insn_file (const rtx_insn *); > extern tree insn_scope (const rtx_insn *); > -extern expanded_location insn_location (const rtx_insn *); > +extern expanded_location insn_location (const rtx_insn *, location_lc *); > extern location_t prologue_location, epilogue_location; > > /* In jump.c */ > diff --git a/gcc/testsuite/gnat.dg/dinst.adb b/gcc/testsuite/gnat.dg/dinst.adb > new file mode 100644 > index 0000000000000..460e6c5f914f4 > --- /dev/null > +++ b/gcc/testsuite/gnat.dg/dinst.adb > @@ -0,0 +1,20 @@ > +-- { dg-do compile { target *-*-gnu* } } > +-- { dg-options "-gnateS -gdwarf -g -O -gno-column-info" } > +-- { dg-final { scan-assembler "loc \[0-9] 5 \[0-9]( is_stmt \[0-9])? > discriminator 1\n" } } */ > +-- { dg-final { scan-assembler-not "loc \[0-9] 5 \[0-9]( is_stmt \[0-9])? > discriminator 2\n" } } */ > +-- { dg-final { scan-assembler "loc \[0-9] 5 \[0-9]( is_stmt \[0-9])? > discriminator 3\n" } } */ > +-- { dg-final { scan-assembler "loc \[0-9] 5 \[0-9]( is_stmt \[0-9])? > discriminator 4\n" } } */ > + > + > +with DInst_Pkg; > +procedure DInst is > + package I1 is new DInst_Pkg; -- instance 1 > + package I2 is new DInst_Pkg; -- instance 2 > + package I3 is new DInst_Pkg; -- instance 3 > + package I4 is new DInst_Pkg; -- instance 4 > +begin > + I1.Foo; > + -- I2.Foo; > + I3.Foo; > + I4.Foo; > +end; > diff --git a/gcc/testsuite/gnat.dg/dinst_pkg.adb > b/gcc/testsuite/gnat.dg/dinst_pkg.adb > new file mode 100644 > index 0000000000000..09a9baea1e4e2 > --- /dev/null > +++ b/gcc/testsuite/gnat.dg/dinst_pkg.adb > @@ -0,0 +1,7 @@ > +with Ada.Text_IO; use Ada.Text_IO; > +package body DInst_Pkg is > + procedure Foo is > + begin > + Put_Line ("hello there"); > + end; > +end; > diff --git a/gcc/testsuite/gnat.dg/dinst_pkg.ads > b/gcc/testsuite/gnat.dg/dinst_pkg.ads > new file mode 100644 > index 0000000000000..d22afdbcd6af5 > --- /dev/null > +++ b/gcc/testsuite/gnat.dg/dinst_pkg.ads > @@ -0,0 +1,4 @@ > +generic > +package DInst_Pkg is > + procedure Foo; > +end; > diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c > index 6a16ce546cb04..1c75d805566cd 100644 > --- a/gcc/tree-inline.c > +++ b/gcc/tree-inline.c > @@ -1813,6 +1813,8 @@ copy_bb (copy_body_data *id, basic_block bb, > copy_basic_block = create_basic_block (NULL, (basic_block) prev->aux); > copy_basic_block->count = bb->count.apply_scale (num, den); > > + copy_basic_block->discriminator = bb->discriminator; > + > copy_gsi = gsi_start_bb (copy_basic_block); > > for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) > diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h > index ba1750d3cf1bb..0c6fcdbe5ff8c 100644 > --- a/libcpp/include/line-map.h > +++ b/libcpp/include/line-map.h > @@ -926,6 +926,14 @@ LINEMAPS_ORDINARY_MAP_AT (const line_maps *set, int > index) > return &set->info_ordinary.maps[index]; > } > > +/* Return the index of ORD_MAP, which is an ordinary map in SET. */ > + > +inline int > +ORDINARY_MAP_INDEX (const line_map_ordinary *ord_map, const line_maps *set) > +{ > + return ord_map - LINEMAPS_ORDINARY_MAP_AT (set, 0); > +} > + > /* Return the number of ordinary maps allocated in the line table > SET. */ > inline unsigned int > > > -- > Alexandre Oliva, freedom fighter https://FSFLA.org/blogs/lxo > Be the change, be Free! FSF Latin America board member > GNU Toolchain Engineer Free Software Evangelist