summaryrefslogtreecommitdiff
path: root/gcc/ada/lib-xref.adb
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-21 13:42:24 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-21 13:42:24 +0000
commit9dfe12ae5b94d03c997ea2903022a5d2d5c5f266 (patch)
treebdfc70477b60f1220cb05dd233a4570dd9c6bb5c /gcc/ada/lib-xref.adb
parent1c662558a1113238a624245a45382d3df90ccf13 (diff)
downloadgcc-9dfe12ae5b94d03c997ea2903022a5d2d5c5f266.tar.gz
2003-10-21 Arnaud Charlet <charlet@act-europe.fr>
* 3psoccon.ads, 3veacodu.adb, 3vexpect.adb, 3vsoccon.ads, 3vsocthi.adb, 3vsocthi.ads, 3vtrasym.adb, 3zsoccon.ads, 3zsocthi.adb, 3zsocthi.ads, 50system.ads, 51system.ads, 55system.ads, 56osinte.adb, 56osinte.ads, 56taprop.adb, 56taspri.ads, 56tpopsp.adb, 57system.ads, 58system.ads, 59system.ads, 5aml-tgt.adb, 5bml-tgt.adb, 5csystem.ads, 5dsystem.ads, 5fosinte.adb, 5gml-tgt.adb, 5hml-tgt.adb, 5isystem.ads, 5lparame.adb, 5msystem.ads, 5psystem.ads, 5sml-tgt.adb, 5sosprim.adb, 5stpopsp.adb, 5tsystem.ads, 5usystem.ads, 5vml-tgt.adb, 5vsymbol.adb, 5vtraent.adb, 5vtraent.ads, 5wml-tgt.adb, 5xparame.ads, 5xsystem.ads, 5xvxwork.ads, 5yparame.ads, 5ytiitho.adb, 5zinit.adb, 5zml-tgt.adb, 5zparame.ads, 5ztaspri.ads, 5ztfsetr.adb, 5zthrini.adb, 5ztiitho.adb, 5ztpopsp.adb, 7stfsetr.adb, 7straces.adb, 7strafor.adb, 7strafor.ads, 7stratas.adb, a-excach.adb, a-exexda.adb, a-exexpr.adb, a-exextr.adb, a-exstat.adb, a-strsup.adb, a-strsup.ads, a-stwisu.adb, a-stwisu.ads, bld.adb, bld.ads, bld-io.adb, bld-io.ads, clean.adb, clean.ads, ctrl_c.c, erroutc.adb, erroutc.ads, errutil.adb, errutil.ads, err_vars.ads, final.c, g-arrspl.adb, g-arrspl.ads, g-boubuf.adb, g-boubuf.ads, g-boumai.ads, g-bubsor.adb, g-bubsor.ads, g-comver.adb, g-comver.ads, g-ctrl_c.ads, g-dynhta.adb, g-dynhta.ads, g-eacodu.adb, g-excact.adb, g-excact.ads, g-heasor.adb, g-heasor.ads, g-memdum.adb, g-memdum.ads, gnatclean.adb, gnatsym.adb, g-pehage.adb, g-pehage.ads, g-perhas.ads, gpr2make.adb, gpr2make.ads, gprcmd.adb, gprep.adb, gprep.ads, g-semaph.adb, g-semaph.ads, g-string.adb, g-string.ads, g-strspl.ads, g-wistsp.ads, i-vthrea.adb, i-vthrea.ads, i-vxwoio.adb, i-vxwoio.ads, Makefile.generic, Makefile.prolog, Makefile.rtl, prep.adb, prep.ads, prepcomp.adb, prepcomp.ads, prj-err.adb, prj-err.ads, s-boarop.ads, s-carsi8.adb, s-carsi8.ads, s-carun8.adb, s-carun8.ads, s-casi16.adb, s-casi16.ads, s-casi32.adb, s-casi32.ads, s-casi64.adb, s-casi64.ads, s-casuti.adb, s-casuti.ads, s-caun16.adb, s-caun16.ads, s-caun32.adb, s-caun32.ads, s-caun64.adb, s-caun64.ads, scng.adb, scng.ads, s-exnint.adb, s-exnllf.adb, s-exnlli.adb, s-expint.adb, s-explli.adb, s-geveop.adb, s-geveop.ads, s-hibaen.ads, s-htable.adb, s-htable.ads, sinput-c.adb, sinput-c.ads, s-memcop.ads, socket.c, s-purexc.ads, s-scaval.adb, s-stopoo.adb, s-strcom.adb, s-strcom.ads, s-strxdr.adb, s-rident.ads, s-thread.adb, s-thread.ads, s-tpae65.adb, s-tpae65.ads, s-tporft.adb, s-traent.adb, s-traent.ads, styleg.adb, styleg.ads, styleg-c.adb, styleg-c.ads, s-veboop.adb, s-veboop.ads, s-vector.ads, symbols.adb, symbols.ads, tb-alvms.c, tb-alvxw.c, tempdir.adb, tempdir.ads, vms_conv.ads, vms_conv.adb, vms_data.ads, vxaddr2line.adb: Files added. Merge with ACT tree. * 4dintnam.ads, 4mintnam.ads, 4uintnam.ads, 52system.ads, 5dosinte.ads, 5etpopse.adb, 5mosinte.ads, 5qosinte.adb, 5qosinte.ads, 5qstache.adb, 5qtaprop.adb, 5qtaspri.ads, 5stpopse.adb, 5uintman.adb, 5uosinte.ads, adafinal.c, g-enblsp.adb, io-aux.c, scn-nlit.adb, scn-slit.adb, s-exnflt.ads, s-exngen.adb, s-exngen.ads, s-exnlfl.ads, s-exnlin.ads, s-exnsfl.ads, s-exnsin.ads, s-exnssi.ads, s-expflt.ads, s-expgen.adb, s-expgen.ads, s-explfl.ads, s-explin.ads, s-expllf.ads, s-expsfl.ads, s-expsin.ads, s-expssi.ads, style.adb: Files removed. Merge with ACT tree. * 1ic.ads, 31soccon.ads, 31soliop.ads, 3asoccon.ads, 3bsoccon.ads, 3gsoccon.ads, 3hsoccon.ads, 3ssoccon.ads, 3ssoliop.ads, 3wsoccon.ads, 3wsocthi.adb, 3wsocthi.ads, 3wsoliop.ads, 41intnam.ads, 42intnam.ads, 4aintnam.ads, 4cintnam.ads, 4gintnam.ads, 4hexcpol.adb, 4hintnam.ads, 4lintnam.ads, 4nintnam.ads, 4ointnam.ads, 4onumaux.ads, 4pintnam.ads, 4sintnam.ads, 4vcaldel.adb, 4vcalend.adb, 4vintnam.ads, 4wexcpol.adb, 4wintnam.ads, 4zintnam.ads, 51osinte.adb, 51osinte.ads, 52osinte.adb, 52osinte.ads, 53osinte.ads, 54osinte.ads, 5aosinte.adb, 5aosinte.ads, 5asystem.ads, 5ataprop.adb, 5atasinf.ads, 5ataspri.ads, 5atpopsp.adb, 5avxwork.ads, 5bosinte.adb, 5bosinte.ads, 5bsystem.ads, 5cosinte.ads, 5esystem.ads, 5fintman.adb, 5fosinte.ads, 5fsystem.ads, 5ftaprop.adb, 5ftasinf.ads, 5ginterr.adb, 5gintman.adb, 5gmastop.adb, 5gosinte.ads, 5gproinf.ads, 5gsystem.ads, 5gtaprop.adb, 5gtasinf.ads, 5gtpgetc.adb, 5hosinte.adb, 5hosinte.ads, 5hsystem.ads, 5htaprop.adb, 5htaspri.ads, 5htraceb.adb, 5iosinte.adb, 5itaprop.adb, 5itaspri.ads, 5ksystem.ads, 5kvxwork.ads, 5lintman.adb, 5lml-tgt.adb, 5losinte.ads, 5lsystem.ads, 5mvxwork.ads, 5ninmaop.adb, 5nintman.adb, 5nosinte.ads, 5ntaprop.adb, 5ntaspri.ads, 5ointerr.adb, 5omastop.adb, 5oosinte.adb, 5oosinte.ads, 5oosprim.adb, 5oparame.adb, 5osystem.ads, 5otaprop.adb, 5otaspri.ads, 5posinte.ads, 5posprim.adb, 5pvxwork.ads, 5sintman.adb, 5sosinte.adb, 5sosinte.ads, 5ssystem.ads, 5staprop.adb, 5stasinf.ads, 5staspri.ads, 5svxwork.ads, 5tosinte.ads, 5vasthan.adb, 5vinmaop.adb, 5vinterr.adb, 5vintman.adb, 5vintman.ads, 5vmastop.adb, 5vosinte.adb, 5vosinte.ads, 5vosprim.adb, 5vsystem.ads, 5vtaprop.adb, 5vtaspri.ads, 5vtpopde.adb, 5vtpopde.ads, 5wgloloc.adb, 5wintman.adb, 5wmemory.adb, 5wosprim.adb, 5wsystem.ads, 5wtaprop.adb, 5wtaspri.ads, 5ysystem.ads, 5zinterr.adb, 5zintman.adb, 5zosinte.adb, 5zosinte.ads, 5zosprim.adb, 5zsystem.ads, 5ztaprop.adb, 6vcpp.adb, 6vcstrea.adb, 6vinterf.ads, 7sinmaop.adb, 7sintman.adb, 7sosinte.adb, 7sosprim.adb, 7staprop.adb, 7staspri.ads, 7stpopsp.adb, 7straceb.adb, 9drpc.adb, a-caldel.adb, a-caldel.ads, a-charac.ads, a-colien.ads, a-comlin.adb, adaint.c, adaint.h, ada-tree.def, a-diocst.adb, a-diocst.ads, a-direio.adb, a-except.adb, a-except.ads, a-excpol.adb, a-exctra.adb, a-exctra.ads, a-filico.adb, a-interr.adb, a-intsig.adb, a-intsig.ads, ali.adb, ali.ads, ali-util.adb, ali-util.ads, a-ngcefu.adb, a-ngcoty.adb, a-ngelfu.adb, a-nudira.adb, a-nudira.ads, a-nuflra.adb, a-nuflra.ads, a-reatim.adb, a-reatim.ads, a-retide.ads, a-sequio.adb, a-siocst.adb, a-siocst.ads, a-ssicst.adb, a-ssicst.ads, a-strbou.adb, a-strbou.ads, a-strfix.adb, a-strmap.adb, a-strsea.ads, a-strunb.adb, a-strunb.ads, a-ststio.adb, a-stunau.adb, a-stunau.ads, a-stwibo.adb, a-stwibo.ads, a-stwifi.adb, a-stwima.adb, a-stwiun.adb, a-stwiun.ads, a-tags.adb, a-tags.ads, a-tasatt.adb, a-taside.adb, a-teioed.adb, a-textio.adb, a-textio.ads, a-tienau.adb, a-tifiio.adb, a-tiflau.adb, a-tiflio.adb, a-tigeau.adb, a-tigeau.ads, a-tiinau.adb, a-timoau.adb, a-tiocst.adb, a-tiocst.ads, atree.adb, atree.ads, a-witeio.adb, a-witeio.ads, a-wtcstr.adb, a-wtcstr.ads, a-wtdeio.adb, a-wtedit.adb, a-wtenau.adb, a-wtflau.adb, a-wtinau.adb, a-wtmoau.adb, bcheck.adb, binde.adb, bindgen.adb, bindusg.adb, checks.adb, checks.ads, cio.c, comperr.adb, comperr.ads, csets.adb, cstand.adb, cstreams.c, debug_a.adb, debug_a.ads, debug.adb, decl.c, einfo.adb, einfo.ads, errout.adb, errout.ads, eval_fat.adb, eval_fat.ads, exp_aggr.adb, expander.adb, expander.ads, exp_attr.adb, exp_ch11.adb, exp_ch13.adb, exp_ch2.adb, exp_ch3.adb, exp_ch3.ads, exp_ch4.adb, exp_ch5.adb, exp_ch6.adb, exp_ch7.adb, exp_ch7.ads, exp_ch8.adb, exp_ch9.adb, exp_code.adb, exp_dbug.adb, exp_dbug.ads, exp_disp.adb, exp_dist.adb, expect.c, exp_fixd.adb, exp_imgv.adb, exp_intr.adb, exp_pakd.adb, exp_prag.adb, exp_strm.adb, exp_strm.ads, exp_tss.adb, exp_tss.ads, exp_util.adb, exp_util.ads, exp_vfpt.adb, fe.h, fmap.adb, fmap.ads, fname.adb, fname.ads, fname-uf.adb, fname-uf.ads, freeze.adb, freeze.ads, frontend.adb, g-awk.adb, g-awk.ads, g-busora.adb, g-busora.ads, g-busorg.adb, g-busorg.ads, g-casuti.adb, g-casuti.ads, g-catiio.adb, g-catiio.ads, g-cgi.adb, g-cgi.ads, g-cgicoo.adb, g-cgicoo.ads, g-cgideb.adb, g-cgideb.ads, g-comlin.adb, g-comlin.ads, g-crc32.adb, g-crc32.ads, g-debpoo.adb, g-debpoo.ads, g-debuti.adb, g-debuti.ads, g-diopit.adb, g-diopit.ads, g-dirope.adb, g-dirope.ads, g-dyntab.adb, g-dyntab.ads, g-except.ads, g-exctra.adb, g-exctra.ads, g-expect.adb, g-expect.ads, g-hesora.adb, g-hesora.ads, g-hesorg.adb, g-hesorg.ads, g-htable.adb, g-htable.ads, gigi.h, g-io.adb, g-io.ads, g-io_aux.adb, g-io_aux.ads, g-locfil.adb, g-locfil.ads, g-md5.adb, g-md5.ads, gmem.c, gnat1drv.adb, gnatbind.adb, gnatchop.adb, gnatcmd.adb, gnatfind.adb, gnatkr.adb, gnatlbr.adb, gnatlink.adb, gnatls.adb, gnatmake.adb, gnatmem.adb, gnatname.adb, gnatprep.adb, gnatprep.ads, gnatpsta.adb, gnatxref.adb, g-os_lib.adb, g-os_lib.ads, g-regexp.adb, g-regexp.ads, g-regist.adb, g-regist.ads, g-regpat.adb, g-regpat.ads, g-soccon.ads, g-socket.adb, g-socket.ads, g-socthi.adb, g-socthi.ads, g-soliop.ads, g-souinf.ads, g-speche.adb, g-speche.ads, g-spipat.adb, g-spipat.ads, g-spitbo.adb, g-spitbo.ads, g-sptabo.ads, g-sptain.ads, g-sptavs.ads, g-table.adb, g-table.ads, g-tasloc.adb, g-tasloc.ads, g-thread.adb, g-thread.ads, g-traceb.adb, g-traceb.ads, g-trasym.adb, g-trasym.ads, hostparm.ads, i-c.ads, i-cobol.adb, i-cpp.adb, i-cstrea.ads, i-cstrin.adb, i-cstrin.ads, impunit.adb, init.c, inline.adb, interfac.ads, i-pacdec.ads, itypes.adb, itypes.ads, i-vxwork.ads, lang.opt, lang-specs.h, layout.adb, lib.adb, lib.ads, lib-list.adb, lib-load.adb, lib-load.ads, lib-sort.adb, lib-util.adb, lib-writ.adb, lib-writ.ads, lib-xref.adb, lib-xref.ads, link.c, live.adb, make.adb, make.ads, Makefile.adalib, Makefile.in, Make-lang.in, makeusg.adb, mdll.adb, mdll-fil.adb, mdll-fil.ads, mdll-utl.adb, mdll-utl.ads, memroot.adb, memroot.ads, memtrack.adb, misc.c, mkdir.c, mlib.adb, mlib.ads, mlib-fil.adb, mlib-fil.ads, mlib-prj.adb, mlib-prj.ads, mlib-tgt.adb, mlib-tgt.ads, mlib-utl.adb, mlib-utl.ads, namet.adb, namet.ads, namet.h, nlists.ads, nlists.h, nmake.adt, opt.adb, opt.ads, osint.adb, osint.ads, osint-b.adb, osint-c.adb, par.adb, par-ch10.adb, par-ch11.adb, par-ch2.adb, par-ch3.adb, par-ch4.adb, par-ch5.adb, par-ch6.adb, par-ch9.adb, par-endh.adb, par-labl.adb, par-load.adb, par-prag.adb, par-sync.adb, par-tchk.adb, par-util.adb, prj.adb, prj.ads, prj-attr.adb, prj-attr.ads, prj-com.adb, prj-com.ads, prj-dect.adb, prj-dect.ads, prj-env.adb, prj-env.ads, prj-ext.adb, prj-ext.ads, prj-makr.adb, prj-makr.ads, prj-nmsc.adb, prj-nmsc.ads, prj-pars.adb, prj-pars.ads, prj-part.adb, prj-part.ads, prj-pp.adb, prj-pp.ads, prj-proc.adb, prj-proc.ads, prj-strt.adb, prj-strt.ads, prj-tree.adb, prj-tree.ads, prj-util.adb, prj-util.ads, raise.c, raise.h, repinfo.adb, repinfo.h, restrict.adb, restrict.ads, rident.ads, rtsfind.adb, rtsfind.ads, s-addima.ads, s-arit64.adb, s-assert.adb, s-assert.ads, s-atacco.adb, s-atacco.ads, s-auxdec.adb, s-auxdec.ads, s-bitops.adb, scans.ads, scn.adb, scn.ads, s-crc32.adb, s-crc32.ads, s-direio.adb, sem.adb, sem.ads, sem_aggr.adb, sem_attr.adb, sem_attr.ads, sem_case.adb, sem_case.ads, sem_cat.adb, sem_cat.ads, sem_ch10.adb, sem_ch11.adb, sem_ch12.adb, sem_ch12.ads, sem_ch13.adb, sem_ch13.ads, sem_ch3.adb, sem_ch3.ads, sem_ch4.adb, sem_ch5.adb, sem_ch5.ads, sem_ch6.adb, sem_ch6.ads, sem_ch7.adb, sem_ch7.ads, sem_ch8.adb, sem_ch8.ads, sem_ch9.adb, sem_disp.adb, sem_disp.ads, sem_dist.adb, sem_elab.adb, sem_eval.adb, sem_eval.ads, sem_intr.adb, sem_maps.adb, sem_mech.adb, sem_prag.adb, sem_prag.ads, sem_res.adb, sem_res.ads, sem_type.adb, sem_type.ads, sem_util.adb, sem_util.ads, sem_warn.adb, s-errrep.adb, s-errrep.ads, s-exctab.adb, s-exctab.ads, s-exnint.ads, s-exnllf.ads, s-exnlli.ads, s-expint.ads, s-explli.ads, s-expuns.ads, s-fatflt.ads, s-fatgen.adb, s-fatgen.ads, s-fatlfl.ads, s-fatllf.ads, s-fatsfl.ads, s-fileio.adb, s-fileio.ads, s-finimp.adb, s-finimp.ads, s-finroo.adb, s-finroo.ads, sfn_scan.adb, s-gloloc.adb, s-gloloc.ads, s-imgdec.adb, s-imgenu.adb, s-imgrea.adb, s-imgwch.adb, sinfo.adb, sinfo.ads, s-inmaop.ads, sinput.adb, sinput.ads, sinput-d.adb, sinput-l.adb, sinput-l.ads, sinput-p.adb, sinput-p.ads, s-interr.adb, s-interr.ads, s-intman.ads, s-maccod.ads, s-mastop.adb, s-mastop.ads, s-memory.adb, s-memory.ads, snames.adb, snames.ads, snames.h, s-osprim.ads, s-parame.ads, s-parint.ads, s-pooloc.adb, s-pooloc.ads, s-poosiz.adb, sprint.adb, s-proinf.ads, s-scaval.ads, s-secsta.adb, s-secsta.ads, s-sequio.adb, s-shasto.adb, s-shasto.ads, s-soflin.ads, s-stache.adb, s-stache.ads, s-stalib.adb, s-stalib.ads, s-stoele.ads, s-stopoo.ads, s-stratt.adb, s-stratt.ads, s-strops.adb, s-strops.ads, s-taasde.adb, s-taasde.ads, s-tadeca.adb, s-tadeca.ads, s-tadert.adb, s-tadert.ads, s-taenca.adb, s-taenca.ads, s-taprob.adb, s-taprob.ads, s-taprop.ads, s-tarest.adb, s-tarest.ads, s-tasdeb.adb, s-tasdeb.ads, s-tasinf.adb, s-tasinf.ads, s-tasini.adb, s-tasini.ads, s-taskin.adb, s-taskin.ads, s-tasque.adb, s-tasque.ads, s-tasren.adb, s-tasren.ads, s-tasres.ads, s-tassta.adb, s-tassta.ads, s-tasuti.adb, s-tasuti.ads, s-tataat.adb, s-tataat.ads, s-tpinop.adb, s-tpinop.ads, s-tpoben.adb, s-tpoben.ads, s-tpobop.adb, s-tpobop.ads, s-tposen.adb, s-tposen.ads, s-traceb.adb, s-traceb.ads, stringt.adb, stringt.ads, stringt.h, style.ads, stylesw.adb, stylesw.ads, s-unstyp.ads, s-vaflop.ads, s-valrea.adb, s-valuti.adb, s-vercon.adb, s-vmexta.adb, s-wchcnv.ads, s-wchcon.ads, s-widcha.adb, switch.adb, switch.ads, switch-b.adb, switch-c.adb, switch-m.adb, s-wwdcha.adb, s-wwdwch.adb, sysdep.c, system.ads, table.adb, table.ads, targparm.adb, targparm.ads, targtyps.c, tbuild.adb, tbuild.ads, tracebak.c, trans.c, tree_io.adb, treepr.adb, treeprs.adt, ttypes.ads, types.ads, types.h, uintp.adb, uintp.ads, uintp.h, uname.adb, urealp.adb, urealp.ads, urealp.h, usage.adb, utils2.c, utils.c, validsw.adb, validsw.ads, widechar.adb, xeinfo.adb, xnmake.adb, xref_lib.adb, xref_lib.ads, xr_tabls.adb, xr_tabls.ads, xtreeprs.adb, xsnames.adb, einfo.h, sinfo.h, treeprs.ads, nmake.ads, nmake.adb, gnatvsn.ads: Merge with ACT tree. * gnatvsn.adb: Rewritten in a simpler and more efficient way. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72751 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/lib-xref.adb')
-rw-r--r--gcc/ada/lib-xref.adb931
1 files changed, 729 insertions, 202 deletions
diff --git a/gcc/ada/lib-xref.adb b/gcc/ada/lib-xref.adb
index dd1e61cbd3f..014a9e97030 100644
--- a/gcc/ada/lib-xref.adb
+++ b/gcc/ada/lib-xref.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 1998-2002, Free Software Foundation, Inc. --
+-- Copyright (C) 1998-2003, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -26,12 +26,17 @@
with Atree; use Atree;
with Csets; use Csets;
+with Elists; use Elists;
with Errout; use Errout;
with Lib.Util; use Lib.Util;
with Namet; use Namet;
+with Nlists; use Nlists;
with Opt; use Opt;
+with Sem_Prag; use Sem_Prag;
with Sinfo; use Sinfo;
with Sinput; use Sinput;
+with Snames; use Snames;
+with Stringt; use Stringt;
with Stand; use Stand;
with Table; use Table;
with Widechar; use Widechar;
@@ -124,6 +129,7 @@ package body Lib.Xref is
Xrefs.Table (Indx).Loc := No_Location;
Xrefs.Table (Indx).Eun := Get_Source_Unit (Loc);
Xrefs.Table (Indx).Lun := No_Unit;
+ Set_Has_Xref_Entry (E);
end if;
end Generate_Definition;
@@ -131,7 +137,10 @@ package body Lib.Xref is
-- Generate_Operator_Reference --
---------------------------------
- procedure Generate_Operator_Reference (N : Node_Id) is
+ procedure Generate_Operator_Reference
+ (N : Node_Id;
+ T : Entity_Id)
+ is
begin
if not In_Extended_Main_Source_Unit (N) then
return;
@@ -161,18 +170,14 @@ package body Lib.Xref is
-- marked as referenced is the first subtype, which is the user
-- defined entity that is relevant.
- else
- if Nkind (N) = N_Op_Eq
- or else Nkind (N) = N_Op_Ne
- or else Nkind (N) = N_Op_Le
- or else Nkind (N) = N_Op_Lt
- or else Nkind (N) = N_Op_Ge
- or else Nkind (N) = N_Op_Gt
- then
- Set_Referenced (First_Subtype (Etype (Right_Opnd (N))));
- else
- Set_Referenced (First_Subtype (Etype (N)));
- end if;
+ -- Note: we only do this for operators that come from source.
+ -- The generated code sometimes reaches for entities that do
+ -- not need to be explicitly visible (for example, when we
+ -- expand the code for comparing two record types, the fields
+ -- of the record may not be visible).
+
+ elsif Comes_From_Source (N) then
+ Set_Referenced (First_Subtype (T));
end if;
end Generate_Operator_Reference;
@@ -197,7 +202,7 @@ package body Lib.Xref is
pragma Assert (Nkind (E) in N_Entity);
-- Never collect references if not in main source unit. However,
- -- we omit this test if Typ is 'e', since these entries are
+ -- we omit this test if Typ is 'e' or 'k', since these entries are
-- really structural, and it is useful to have them in units
-- that reference packages as well as units that define packages.
-- We also omit the test for the case of 'p' since we want to
@@ -206,11 +211,12 @@ package body Lib.Xref is
if not In_Extended_Main_Source_Unit (N)
and then Typ /= 'e'
and then Typ /= 'p'
+ and then Typ /= 'k'
then
return;
end if;
- -- For reference type p, then entity must be in main source unit
+ -- For reference type p, the entity must be in main source unit
if Typ = 'p' and then not In_Extended_Main_Source_Unit (E) then
return;
@@ -233,9 +239,43 @@ package body Lib.Xref is
-- package contains no referenced entities).
if Set_Ref then
- Set_Referenced (E);
- -- Check for pragma unreferenced given
+ -- For a variable that appears on the left side of an
+ -- assignment statement, we set the Referenced_As_LHS
+ -- flag since this is indeed a left hand side.
+
+ if Ekind (E) = E_Variable
+ and then Nkind (Parent (N)) = N_Assignment_Statement
+ and then Name (Parent (N)) = N
+ and then No (Renamed_Object (E))
+ then
+ Set_Referenced_As_LHS (E);
+
+ -- Check for a reference in a pragma that should not count as a
+ -- making the variable referenced for warning purposes.
+
+ elsif Is_Non_Significant_Pragma_Reference (N) then
+ null;
+
+ -- A reference in an attribute definition clause does not
+ -- count as a reference except for the case of Address.
+ -- The reason that 'Address is an exception is that it
+ -- creates an alias through which the variable may be
+ -- referenced.
+
+ elsif Nkind (Parent (N)) = N_Attribute_Definition_Clause
+ and then Chars (Parent (N)) /= Name_Address
+ and then N = Name (Parent (N))
+ then
+ null;
+
+ -- Any other occurrence counts as referencing the entity
+
+ else
+ Set_Referenced (E);
+ end if;
+
+ -- Check for pragma Unreferenced given
if Has_Pragma_Unreferenced (E) then
@@ -248,6 +288,15 @@ package body Lib.Xref is
then
null;
+ -- Neither does a reference to a variable on the left side
+ -- of an assignment
+
+ elsif Ekind (E) = E_Variable
+ and then Nkind (Parent (N)) = N_Assignment_Statement
+ and then Name (Parent (N)) = N
+ then
+ null;
+
-- Here we issue the warning, since this is a real reference
else
@@ -299,6 +348,8 @@ package body Lib.Xref is
or else
Nkind (N) = N_Defining_Operator_Symbol
or else
+ Nkind (N) = N_Operator_Symbol
+ or else
(Nkind (N) = N_Character_Literal
and then Sloc (Entity (N)) /= Standard_Location)
or else
@@ -322,16 +373,33 @@ package body Lib.Xref is
Ent := E;
-- Entity does not come from source, but is a derived subprogram
- -- and the derived subprogram comes from source, in which case
- -- the reference is to this parent subprogram.
+ -- and the derived subprogram comes from source (after one or more
+ -- derivations) in which case the reference is to parent subprogram.
elsif Is_Overloadable (E)
and then Present (Alias (E))
- and then Comes_From_Source (Alias (E))
then
Ent := Alias (E);
- -- Ignore reference to any other source that is not from source
+ loop
+ if Comes_From_Source (Ent) then
+ exit;
+ elsif No (Alias (Ent)) then
+ return;
+ else
+ Ent := Alias (Ent);
+ end if;
+ end loop;
+
+ -- Record components of discriminated subtypes or derived types
+ -- must be treated as references to the original component.
+
+ elsif Ekind (E) = E_Component
+ and then Comes_From_Source (Original_Record_Component (E))
+ then
+ Ent := Original_Record_Component (E);
+
+ -- Ignore reference to any other entity that is not from source
else
return;
@@ -346,79 +414,295 @@ package body Lib.Xref is
Indx := Xrefs.Last;
Xrefs.Table (Indx).Loc := Ref;
- Xrefs.Table (Indx).Typ := Typ;
+
+ -- Overriding operations are marked with 'P'.
+
+ if Typ = 'p'
+ and then Is_Subprogram (N)
+ and then Is_Overriding_Operation (N)
+ then
+ Xrefs.Table (Indx).Typ := 'P';
+ else
+ Xrefs.Table (Indx).Typ := Typ;
+ end if;
+
Xrefs.Table (Indx).Eun := Get_Source_Unit (Def);
Xrefs.Table (Indx).Lun := Get_Source_Unit (Ref);
Xrefs.Table (Indx).Ent := Ent;
+ Set_Has_Xref_Entry (Ent);
end if;
end Generate_Reference;
+ -----------------------------------
+ -- Generate_Reference_To_Formals --
+ -----------------------------------
+
+ procedure Generate_Reference_To_Formals (E : Entity_Id) is
+ Formal : Entity_Id;
+
+ begin
+ if Is_Generic_Subprogram (E) then
+ Formal := First_Entity (E);
+
+ while Present (Formal)
+ and then not Is_Formal (Formal)
+ loop
+ Next_Entity (Formal);
+ end loop;
+
+ else
+ Formal := First_Formal (E);
+ end if;
+
+ while Present (Formal) loop
+ if Ekind (Formal) = E_In_Parameter then
+
+ if Nkind (Parameter_Type (Parent (Formal)))
+ = N_Access_Definition
+ then
+ Generate_Reference (E, Formal, '^', False);
+ else
+ Generate_Reference (E, Formal, '>', False);
+ end if;
+
+ elsif Ekind (Formal) = E_In_Out_Parameter then
+ Generate_Reference (E, Formal, '=', False);
+
+ else
+ Generate_Reference (E, Formal, '<', False);
+ end if;
+
+ Next_Formal (Formal);
+ end loop;
+ end Generate_Reference_To_Formals;
+
+ -------------------------------------------
+ -- Generate_Reference_To_Generic_Formals --
+ -------------------------------------------
+
+ procedure Generate_Reference_To_Generic_Formals (E : Entity_Id) is
+ Formal : Entity_Id;
+
+ begin
+ Formal := First_Entity (E);
+
+ while Present (Formal) loop
+ if Comes_From_Source (Formal) then
+ Generate_Reference (E, Formal, 'z', False);
+ end if;
+
+ Next_Entity (Formal);
+ end loop;
+ end Generate_Reference_To_Generic_Formals;
+
+ ----------------
+ -- Initialize --
+ ----------------
+
+ procedure Initialize is
+ begin
+ Xrefs.Init;
+ end Initialize;
+
-----------------------
-- Output_References --
-----------------------
procedure Output_References is
- Nrefs : constant Nat := Xrefs.Last;
- Rnums : array (0 .. Nrefs) of Nat;
- -- This array contains numbers of references in the Xrefs table. This
- -- list is sorted in output order. The extra 0'th entry is convenient
- -- for the call to sort. When we sort the table, we move these entries
- -- around, but we do not move the original table entries.
+ procedure Get_Type_Reference
+ (Ent : Entity_Id;
+ Tref : out Entity_Id;
+ Left : out Character;
+ Right : out Character);
+ -- Given an entity id Ent, determines whether a type reference is
+ -- required. If so, Tref is set to the entity for the type reference
+ -- and Left and Right are set to the left/right brackets to be
+ -- output for the reference. If no type reference is required, then
+ -- Tref is set to Empty, and Left/Right are set to space.
+
+ procedure Output_Import_Export_Info (Ent : Entity_Id);
+ -- Ouput language and external name information for an interfaced
+ -- entity, using the format <language, external_name>,
+
+ ------------------------
+ -- Get_Type_Reference --
+ ------------------------
+
+ procedure Get_Type_Reference
+ (Ent : Entity_Id;
+ Tref : out Entity_Id;
+ Left : out Character;
+ Right : out Character)
+ is
+ Sav : Entity_Id;
+
+ begin
+ -- See if we have a type reference
- function Lt (Op1, Op2 : Natural) return Boolean;
- -- Comparison function for Sort call
+ Tref := Ent;
+ Left := '{';
+ Right := '}';
- procedure Move (From : Natural; To : Natural);
- -- Move procedure for Sort call
+ loop
+ Sav := Tref;
- function Lt (Op1, Op2 : Natural) return Boolean is
- T1 : Xref_Entry renames Xrefs.Table (Rnums (Nat (Op1)));
- T2 : Xref_Entry renames Xrefs.Table (Rnums (Nat (Op2)));
+ -- Processing for types
- begin
- -- First test. If entity is in different unit, sort by unit
+ if Is_Type (Tref) then
+
+ -- Case of base type
+
+ if Base_Type (Tref) = Tref then
+
+ -- If derived, then get first subtype
+
+ if Tref /= Etype (Tref) then
+ Tref := First_Subtype (Etype (Tref));
+
+ -- Set brackets for derived type, but don't
+ -- override pointer case since the fact that
+ -- something is a pointer is more important
+
+ if Left /= '(' then
+ Left := '<';
+ Right := '>';
+ end if;
+
+ -- If non-derived ptr, get directly designated type.
+ -- If the type has a full view, all references are
+ -- on the partial view, that is seen first.
+
+ elsif Is_Access_Type (Tref) then
+ Tref := Directly_Designated_Type (Tref);
+ Left := '(';
+ Right := ')';
+
+ elsif Is_Private_Type (Tref)
+ and then Present (Full_View (Tref))
+ and then Is_Access_Type (Full_View (Tref))
+ then
+ Tref := Directly_Designated_Type (Full_View (Tref));
+ Left := '(';
+ Right := ')';
+
+ -- If non-derived array, get component type.
+ -- Skip component type for case of String
+ -- or Wide_String, saves worthwhile space.
+
+ elsif Is_Array_Type (Tref)
+ and then Tref /= Standard_String
+ and then Tref /= Standard_Wide_String
+ then
+ Tref := Component_Type (Tref);
+ Left := '(';
+ Right := ')';
+
+ -- For other non-derived base types, nothing
+
+ else
+ exit;
+ end if;
+
+ -- For a subtype, go to ancestor subtype. If it is a
+ -- subtype created for a generic actual, not clear yet
+ -- what is the right type to use ???
+
+ else
+ Tref := Ancestor_Subtype (Tref);
+
+ -- If no ancestor subtype, go to base type
+
+ if No (Tref) then
+ Tref := Base_Type (Sav);
+ end if;
+ end if;
+
+ -- For objects, functions, enum literals,
+ -- just get type from Etype field.
+
+ elsif Is_Object (Tref)
+ or else Ekind (Tref) = E_Enumeration_Literal
+ or else Ekind (Tref) = E_Function
+ or else Ekind (Tref) = E_Operator
+ then
+ Tref := Etype (Tref);
- if T1.Eun /= T2.Eun then
- return Dependency_Num (T1.Eun) < Dependency_Num (T2.Eun);
+ -- For anything else, exit
- -- Second test, within same unit, sort by entity Sloc
+ else
+ exit;
+ end if;
- elsif T1.Def /= T2.Def then
- return T1.Def < T2.Def;
+ -- Exit if no type reference, or we are stuck in
+ -- some loop trying to find the type reference, or
+ -- if the type is standard void type (the latter is
+ -- an implementation artifact that should not show
+ -- up in the generated cross-references).
- -- Third test, sort definitions ahead of references
+ exit when No (Tref)
+ or else Tref = Sav
+ or else Tref = Standard_Void_Type;
- elsif T1.Loc = No_Location then
- return True;
+ -- If we have a usable type reference, return, otherwise
+ -- keep looking for something useful (we are looking for
+ -- something that either comes from source or standard)
+
+ if Sloc (Tref) = Standard_Location
+ or else Comes_From_Source (Tref)
+ then
+ return;
+ end if;
+ end loop;
- elsif T2.Loc = No_Location then
- return False;
+ -- If we fall through the loop, no type reference
- -- Fourth test, for same entity, sort by reference location unit
+ Tref := Empty;
+ Left := ' ';
+ Right := ' ';
+ end Get_Type_Reference;
- elsif T1.Lun /= T2.Lun then
- return Dependency_Num (T1.Lun) < Dependency_Num (T2.Lun);
+ -------------------------------
+ -- Output_Import_Export_Info --
+ -------------------------------
- -- Fifth test order of location within referencing unit
+ procedure Output_Import_Export_Info (Ent : Entity_Id) is
+ Language_Name : Name_Id;
+ Conv : constant Convention_Id := Convention (Ent);
+ begin
+ if Conv = Convention_C then
+ Language_Name := Name_C;
- elsif T1.Loc /= T2.Loc then
- return T1.Loc < T2.Loc;
+ elsif Conv = Convention_CPP then
+ Language_Name := Name_CPP;
- -- Finally, for two locations at the same address, we prefer
- -- the one that does NOT have the type 'r' so that a modification
- -- or extension takes preference, when there are more than one
- -- reference at the same location.
+ elsif Conv = Convention_Ada then
+ Language_Name := Name_Ada;
else
- return T2.Typ = 'r';
+ -- These are the only languages that GPS knows about.
+
+ return;
end if;
- end Lt;
- procedure Move (From : Natural; To : Natural) is
- begin
- Rnums (Nat (To)) := Rnums (Nat (From));
- end Move;
+ Write_Info_Char ('<');
+ Get_Unqualified_Name_String (Language_Name);
+
+ for J in 1 .. Name_Len loop
+ Write_Info_Char (Name_Buffer (J));
+ end loop;
+
+ if Present (Interface_Name (Ent)) then
+ Write_Info_Char (',');
+ String_To_Name_Buffer (Strval (Interface_Name (Ent)));
+
+ for J in 1 .. Name_Len loop
+ Write_Info_Char (Name_Buffer (J));
+ end loop;
+ end if;
+
+ Write_Info_Char ('>');
+ end Output_Import_Export_Info;
-- Start of processing for Output_References
@@ -427,28 +711,141 @@ package body Lib.Xref is
return;
end if;
- -- Capture the definition Sloc values. We delay doing this till now,
- -- since at the time the reference or definition is made, private
- -- types may be swapped, and the Sloc value may be incorrect. We
- -- also set up the pointer vector for the sort.
+ -- Before we go ahead and output the references we have a problem
+ -- that needs dealing with. So far we have captured things that are
+ -- definitely referenced by the main unit, or defined in the main
+ -- unit. That's because we don't want to clutter up the ali file
+ -- for this unit with definition lines for entities in other units
+ -- that are not referenced.
+
+ -- But there is a glitch. We may reference an entity in another unit,
+ -- and it may have a type reference to an entity that is not directly
+ -- referenced in the main unit, which may mean that there is no xref
+ -- entry for this entity yet in the list of references.
+
+ -- If we don't do something about this, we will end with an orphan
+ -- type reference, i.e. it will point to an entity that does not
+ -- appear within the generated references in the ali file. That is
+ -- not good for tools using the xref information.
+
+ -- To fix this, we go through the references adding definition
+ -- entries for any unreferenced entities that can be referenced
+ -- in a type reference. There is a recursion problem here, and
+ -- that is dealt with by making sure that this traversal also
+ -- traverses any entries that get added by the traversal.
+
+ declare
+ J : Nat;
+ Tref : Entity_Id;
+ L, R : Character;
+ Indx : Nat;
+ Ent : Entity_Id;
+ Loc : Source_Ptr;
- for J in 1 .. Nrefs loop
- Rnums (J) := J;
- Xrefs.Table (J).Def :=
- Original_Location (Sloc (Xrefs.Table (J).Ent));
- end loop;
+ begin
+ -- Note that this is not a for loop for a very good reason. The
+ -- processing of items in the table can add new items to the
+ -- table, and they must be processed as well
+
+ J := 1;
+ while J <= Xrefs.Last loop
+ Ent := Xrefs.Table (J).Ent;
+ Get_Type_Reference (Ent, Tref, L, R);
+
+ if Present (Tref)
+ and then not Has_Xref_Entry (Tref)
+ and then Sloc (Tref) > No_Location
+ then
+ Xrefs.Increment_Last;
+ Indx := Xrefs.Last;
+ Loc := Original_Location (Sloc (Tref));
+ Xrefs.Table (Indx).Ent := Tref;
+ Xrefs.Table (Indx).Loc := No_Location;
+ Xrefs.Table (Indx).Eun := Get_Source_Unit (Loc);
+ Xrefs.Table (Indx).Lun := No_Unit;
+ Set_Has_Xref_Entry (Tref);
+ end if;
+
+ -- Collect inherited primitive operations that may be
+ -- declared in another unit and have no visible reference
+ -- in the current one.
+
+ if Is_Type (Ent)
+ and then Is_Tagged_Type (Ent)
+ and then Is_Derived_Type (Ent)
+ and then Ent = Base_Type (Ent)
+ and then In_Extended_Main_Source_Unit (Ent)
+ then
- -- Sort the references
+ declare
+ Op_List : Elist_Id := Primitive_Operations (Ent);
+ Op : Elmt_Id;
+ Prim : Entity_Id;
- GNAT.Heap_Sort_A.Sort
- (Integer (Nrefs),
- Move'Unrestricted_Access,
- Lt'Unrestricted_Access);
+ function Parent_Op (E : Entity_Id) return Entity_Id;
+ -- Find original operation, which may be inherited
+ -- through several derivations.
- -- Now output the references
+ function Parent_Op (E : Entity_Id) return Entity_Id is
+ Orig_Op : Entity_Id := Alias (E);
+ begin
+ if No (Orig_Op) then
+ return Empty;
+
+ elsif not Comes_From_Source (E)
+ and then not Has_Xref_Entry (Orig_Op)
+ and then Comes_From_Source (Orig_Op)
+ then
+ return Orig_Op;
+ else
+ return Parent_Op (Orig_Op);
+ end if;
+ end Parent_Op;
+
+ begin
+ Op := First_Elmt (Op_List);
+
+ while Present (Op) loop
+
+ Prim := Parent_Op (Node (Op));
+
+ if Present (Prim) then
+ Xrefs.Increment_Last;
+ Indx := Xrefs.Last;
+ Loc := Original_Location (Sloc (Prim));
+ Xrefs.Table (Indx).Ent := Prim;
+ Xrefs.Table (Indx).Loc := No_Location;
+ Xrefs.Table (Indx).Eun :=
+ Get_Source_Unit (Sloc (Prim));
+ Xrefs.Table (Indx).Lun := No_Unit;
+ Set_Has_Xref_Entry (Prim);
+ end if;
+
+ Next_Elmt (Op);
+ end loop;
+ end;
+ end if;
+
+ J := J + 1;
+ end loop;
+ end;
+
+ -- Now we have all the references, including those for any embedded
+ -- type references, so we can sort them, and output them.
Output_Refs : declare
+ Nrefs : Nat := Xrefs.Last;
+ -- Number of references in table. This value may get reset
+ -- (reduced) when we eliminate duplicate reference entries.
+
+ Rnums : array (0 .. Nrefs) of Nat;
+ -- This array contains numbers of references in the Xrefs table.
+ -- This list is sorted in output order. The extra 0'th entry is
+ -- convenient for the call to sort. When we sort the table, we
+ -- move the entries in Rnums around, but we do not move the
+ -- original table entries.
+
Curxu : Unit_Number_Type;
-- Current xref unit
@@ -483,9 +880,71 @@ package body Lib.Xref is
Trunit : Unit_Number_Type;
-- Unit number for type reference
+ function Lt (Op1, Op2 : Natural) return Boolean;
+ -- Comparison function for Sort call
+
function Name_Change (X : Entity_Id) return Boolean;
-- Determines if entity X has a different simple name from Curent
+ procedure Move (From : Natural; To : Natural);
+ -- Move procedure for Sort call
+
+ --------
+ -- Lt --
+ --------
+
+ function Lt (Op1, Op2 : Natural) return Boolean is
+ T1 : Xref_Entry renames Xrefs.Table (Rnums (Nat (Op1)));
+ T2 : Xref_Entry renames Xrefs.Table (Rnums (Nat (Op2)));
+
+ begin
+ -- First test. If entity is in different unit, sort by unit
+
+ if T1.Eun /= T2.Eun then
+ return Dependency_Num (T1.Eun) < Dependency_Num (T2.Eun);
+
+ -- Second test, within same unit, sort by entity Sloc
+
+ elsif T1.Def /= T2.Def then
+ return T1.Def < T2.Def;
+
+ -- Third test, sort definitions ahead of references
+
+ elsif T1.Loc = No_Location then
+ return True;
+
+ elsif T2.Loc = No_Location then
+ return False;
+
+ -- Fourth test, for same entity, sort by reference location unit
+
+ elsif T1.Lun /= T2.Lun then
+ return Dependency_Num (T1.Lun) < Dependency_Num (T2.Lun);
+
+ -- Fifth test order of location within referencing unit
+
+ elsif T1.Loc /= T2.Loc then
+ return T1.Loc < T2.Loc;
+
+ -- Finally, for two locations at the same address, we prefer
+ -- the one that does NOT have the type 'r' so that a modification
+ -- or extension takes preference, when there are more than one
+ -- reference at the same location.
+
+ else
+ return T2.Typ = 'r';
+ end if;
+ end Lt;
+
+ ----------
+ -- Move --
+ ----------
+
+ procedure Move (From : Natural; To : Natural) is
+ begin
+ Rnums (Nat (To)) := Rnums (Nat (From));
+ end Move;
+
-----------------
-- Name_Change --
-----------------
@@ -505,15 +964,64 @@ package body Lib.Xref is
-- Start of processing for Output_Refs
begin
+ -- Capture the definition Sloc values. We delay doing this till now,
+ -- since at the time the reference or definition is made, private
+ -- types may be swapped, and the Sloc value may be incorrect. We
+ -- also set up the pointer vector for the sort.
+
+ for J in 1 .. Nrefs loop
+ Rnums (J) := J;
+ Xrefs.Table (J).Def :=
+ Original_Location (Sloc (Xrefs.Table (J).Ent));
+ end loop;
+
+ -- Sort the references
+
+ GNAT.Heap_Sort_A.Sort
+ (Integer (Nrefs),
+ Move'Unrestricted_Access,
+ Lt'Unrestricted_Access);
+
+ -- Eliminate duplicate entries
+
+ declare
+ NR : constant Nat := Nrefs;
+
+ begin
+ -- We need this test for NR because if we force ALI file
+ -- generation in case of errors detected, it may be the case
+ -- that Nrefs is 0, so we should not reset it here
+
+ if NR >= 2 then
+ Nrefs := 1;
+
+ for J in 2 .. NR loop
+ if Xrefs.Table (Rnums (J)) /=
+ Xrefs.Table (Rnums (Nrefs))
+ then
+ Nrefs := Nrefs + 1;
+ Rnums (Nrefs) := Rnums (J);
+ end if;
+ end loop;
+ end if;
+ end;
+
+ -- Initialize loop through references
+
Curxu := No_Unit;
Curent := Empty;
Curdef := No_Location;
Curru := No_Unit;
Crloc := No_Location;
- for Refno in 1 .. Nrefs loop
+ -- Loop to output references
+ for Refno in 1 .. Nrefs loop
Output_One_Ref : declare
+ P2 : Source_Ptr;
+ WC : Char_Code;
+ Err : Boolean;
+ Ent : Entity_Id;
XE : Xref_Entry renames Xrefs.Table (Rnums (Refno));
-- The current entry to be accessed
@@ -521,15 +1029,9 @@ package body Lib.Xref is
P : Source_Ptr;
-- Used to index into source buffer to get entity name
- P2 : Source_Ptr;
- WC : Char_Code;
- Err : Boolean;
- Ent : Entity_Id;
- Sav : Entity_Id;
-
Left : Character;
Right : Character;
- -- Used for {} or <> for type reference
+ -- Used for {} or <> or () for type reference
procedure Output_Instantiation_Refs (Loc : Source_Ptr);
-- Recursive procedure to output instantiation references for
@@ -543,6 +1045,7 @@ package body Lib.Xref is
procedure Output_Instantiation_Refs (Loc : Source_Ptr) is
Iloc : constant Source_Ptr := Instantiation_Location (Loc);
Lun : Unit_Number_Type;
+ Cu : constant Unit_Number_Type := Curru;
begin
-- Nothing to do if this is not an instantiation
@@ -557,7 +1060,7 @@ package body Lib.Xref is
Lun := Get_Source_Unit (Iloc);
if Lun /= Curru then
- Curru := XE.Lun;
+ Curru := Lun;
Write_Info_Nat (Dependency_Num (Curru));
Write_Info_Char ('|');
end if;
@@ -571,6 +1074,7 @@ package body Lib.Xref is
-- Output final ] after call to get proper nesting
Write_Info_Char (']');
+ Curru := Cu;
return;
end Output_Instantiation_Refs;
@@ -628,7 +1132,7 @@ package body Lib.Xref is
Ent := Underlying_Type (Etype (XE.Ent));
if Present (Ent) then
- Ctyp := Xref_Entity_Letters (Ekind (Ent));
+ Ctyp := Fold_Lower (Xref_Entity_Letters (Ekind (Ent)));
end if;
end if;
@@ -646,20 +1150,41 @@ package body Lib.Xref is
end if;
end if;
+ -- Special handling for abstract types and operations.
+
+ if Is_Abstract (XE.Ent) then
+
+ if Ctyp = 'U' then
+ Ctyp := 'x'; -- abstract procedure
+
+ elsif Ctyp = 'V' then
+ Ctyp := 'y'; -- abstract function
+
+ elsif Ctyp = 'R' then
+ Ctyp := 'H'; -- abstract type
+ end if;
+ end if;
+
-- Only output reference if interesting type of entity,
- -- and suppress self references. Also suppress definitions
- -- of body formals (we only treat these as references, and
- -- the references were separately recorded).
-
- if Ctyp /= ' '
- and then XE.Loc /= XE.Def
- and then (not Is_Formal (XE.Ent)
- or else No (Spec_Entity (XE.Ent)))
+ -- and suppress self references, except for bodies that
+ -- act as specs. Also suppress definitions of body formals
+ -- (we only treat these as references, and the references
+ -- were separately recorded).
+
+ if Ctyp = ' '
+ or else (XE.Loc = XE.Def
+ and then
+ (XE.Typ /= 'b'
+ or else not Is_Subprogram (XE.Ent)))
+ or else (Is_Formal (XE.Ent)
+ and then Present (Spec_Entity (XE.Ent)))
then
+ null;
+
+ else
-- Start new Xref section if new xref unit
if XE.Eun /= Curxu then
-
if Write_Info_Col > 1 then
Write_Info_EOL;
end if;
@@ -705,11 +1230,92 @@ package body Lib.Xref is
-- Write level information
- if Is_Public (Curent) and then not Is_Hidden (Curent) then
- Write_Info_Char ('*');
- else
- Write_Info_Char (' ');
- end if;
+ Write_Level_Info : declare
+ function Is_Visible_Generic_Entity
+ (E : Entity_Id) return Boolean;
+ -- Check whether E is declared in the visible part
+ -- of a generic package. For source navigation
+ -- purposes, treat this as a visible entity.
+
+ function Is_Private_Record_Component
+ (E : Entity_Id) return Boolean;
+ -- Check whether E is a non-inherited component of a
+ -- private extension. Even if the enclosing record is
+ -- public, we want to treat the component as private
+ -- for navigation purposes.
+
+ ---------------------------------
+ -- Is_Private_Record_Component --
+ ---------------------------------
+
+ function Is_Private_Record_Component
+ (E : Entity_Id) return Boolean
+ is
+ S : constant Entity_Id := Scope (E);
+ begin
+ return
+ Ekind (E) = E_Component
+ and then Nkind (Declaration_Node (S)) =
+ N_Private_Extension_Declaration
+ and then Original_Record_Component (E) = E;
+ end Is_Private_Record_Component;
+
+ -------------------------------
+ -- Is_Visible_Generic_Entity --
+ -------------------------------
+
+ function Is_Visible_Generic_Entity
+ (E : Entity_Id) return Boolean
+ is
+ Par : Node_Id;
+
+ begin
+ if Ekind (Scope (E)) /= E_Generic_Package then
+ return False;
+ end if;
+
+ Par := Parent (E);
+ while Present (Par) loop
+ if
+ Nkind (Par) = N_Generic_Package_Declaration
+ then
+ -- Entity is a generic formal
+
+ return False;
+
+ elsif
+ Nkind (Parent (Par)) = N_Package_Specification
+ then
+ return
+ Is_List_Member (Par)
+ and then List_Containing (Par) =
+ Visible_Declarations (Parent (Par));
+ else
+ Par := Parent (Par);
+ end if;
+ end loop;
+
+ return False;
+ end Is_Visible_Generic_Entity;
+
+ -- Start of processing for Write_Level_Info
+
+ begin
+ if Is_Hidden (Curent)
+ or else Is_Private_Record_Component (Curent)
+ then
+ Write_Info_Char (' ');
+
+ elsif
+ Is_Public (Curent)
+ or else Is_Visible_Generic_Entity (Curent)
+ then
+ Write_Info_Char ('*');
+
+ else
+ Write_Info_Char (' ');
+ end if;
+ end Write_Level_Info;
-- Output entity name. We use the occurrence from the
-- actual source program at the definition point
@@ -799,89 +1405,16 @@ package body Lib.Xref is
(Int (Get_Column_Number (Sloc (Rref))));
end if;
- -- See if we have a type reference
-
- Tref := XE.Ent;
- Left := '{';
- Right := '}';
-
- loop
- Sav := Tref;
-
- -- Processing for types
-
- if Is_Type (Tref) then
-
- -- Case of base type
-
- if Base_Type (Tref) = Tref then
-
- -- If derived, then get first subtype
-
- if Tref /= Etype (Tref) then
- Tref := First_Subtype (Etype (Tref));
-
- -- Set brackets for derived type, but don't
- -- override pointer case since the fact that
- -- something is a pointer is more important
-
- if Left /= '(' then
- Left := '<';
- Right := '>';
- end if;
-
- -- If non-derived ptr, get designated type
-
- elsif Is_Access_Type (Tref) then
- Tref := Designated_Type (Tref);
- Left := '(';
- Right := ')';
+ -- Indicate that the entity is in the unit
+ -- of the current xref xection.
- -- For other non-derived base types, nothing
-
- else
- exit;
- end if;
-
- -- For a subtype, go to ancestor subtype
-
- else
- Tref := Ancestor_Subtype (Tref);
-
- -- If no ancestor subtype, go to base type
-
- if No (Tref) then
- Tref := Base_Type (Sav);
- end if;
- end if;
-
- -- For objects, functions, enum literals,
- -- just get type from Etype field.
-
- elsif Is_Object (Tref)
- or else Ekind (Tref) = E_Enumeration_Literal
- or else Ekind (Tref) = E_Function
- or else Ekind (Tref) = E_Operator
- then
- Tref := Etype (Tref);
-
- -- For anything else, exit
-
- else
- exit;
- end if;
+ Curru := Curxu;
- -- Exit if no type reference, or we are stuck in
- -- some loop trying to find the type reference, or
- -- if the type is standard void type (the latter is
- -- an implementation artifact that should not show
- -- up in the generated cross-references).
+ -- See if we have a type reference and if so output
- exit when No (Tref)
- or else Tref = Sav
- or else Tref = Standard_Void_Type;
+ Get_Type_Reference (XE.Ent, Tref, Left, Right);
- -- Here we have a type reference to output
+ if Present (Tref) then
-- Case of standard entity, output name
@@ -889,22 +1422,10 @@ package body Lib.Xref is
Write_Info_Char (Left);
Write_Info_Name (Chars (Tref));
Write_Info_Char (Right);
- exit;
-- Case of source entity, output location
- elsif Comes_From_Source (Tref) then
-
- -- Do not output type reference if referenced
- -- entity is not in the main unit and is itself
- -- not referenced, since otherwise the reference
- -- will dangle.
-
- exit when not Referenced (Tref)
- and then not In_Extended_Main_Source_Unit (Tref);
-
- -- Output the reference
-
+ else
Write_Info_Char (Left);
Trunit := Get_Source_Unit (Sloc (Tref));
@@ -937,19 +1458,17 @@ package body Lib.Xref is
Write_Info_Nat
(Int (Get_Column_Number (Sloc (Tref))));
- Write_Info_Char (Right);
- exit;
- -- If non-standard, non-source entity, keep looking
+ -- If the type comes from an instantiation,
+ -- add the corresponding info.
- else
- null;
+ Output_Instantiation_Refs (Sloc (Tref));
+ Write_Info_Char (Right);
end if;
- end loop;
+ end if;
-- End of processing for entity output
- Curru := Curxu;
Crloc := No_Location;
end if;
@@ -979,6 +1498,14 @@ package body Lib.Xref is
Write_Info_Nat (Int (Get_Logical_Line_Number (XE.Loc)));
Write_Info_Char (XE.Typ);
+
+ if Is_Overloadable (XE.Ent)
+ and then Is_Imported (XE.Ent)
+ and then XE.Typ = 'b'
+ then
+ Output_Import_Export_Info (XE.Ent);
+ end if;
+
Write_Info_Nat (Int (Get_Column_Number (XE.Loc)));
Output_Instantiation_Refs (Sloc (XE.Ent));