]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit - gdb/ada-lang.c
Cache the TSD type in inferior-data (performance).
authorJoel Brobecker <brobecker@gnat.com>
Fri, 28 May 2010 01:32:08 +0000 (01:32 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 28 May 2010 01:32:08 +0000 (01:32 +0000)
commite802dbe04fefcc694efa1ae0c26effc830841a96
tree40526585f6ee2456dcfcef56e8ae4239060bd5af
parente15a9a5e1c53753e796aef73051f753e682df522
Cache the TSD type in inferior-data (performance).

This is something I noticed while looking at ada_find_any_type.
Use of that function is expensive, since it causes a global lookup.
Reviewing some of the uses, I found that we were calling it to get
a specific type everytime we print a tagged type (the equivalent of
classes in C++); and not only that, we did it 4 times [1]!

Since the type in question (ada__tags__type_specific_data) is guarantied
to remain the same througout the entire life of the inferior, the solution
was to cache that type in inferior private data.  This patch creates
an ada-land private-data area, and uses it to store that type after
the first time we look it up.

[1]: The problem is mitigated in AdaCore's tree because we use an Ada
     symbol cache which we are thinking of contributing to the FSF tree.
     But that's still pretty bad, regardless.

2010-05-27  Joel Brobecker  <brobecker@adacore.com>

        * ada-lang.c (ada_inferior_data): New struct.
        (ada_inferior_data): New static global.
        (ada_inferior_data_cleanup, get_ada_inferior_data, ada_inferior_exit)
        (ada_get_tsd_type): New functions.
        (ada_tag_name_2): Use ada_get_tsd_type instead of ada_find_any_type
        to look the tsd type up.
        (_initialize_ada_language): Attach ada_inferior_exit to inferior_exit
        event.  Set ada_inferior_data.
gdb/ChangeLog
gdb/ada-lang.c