aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-alias.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2019-06-03 23:37:04 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-06-03 23:37:04 +0000
commit39c0aa5f74be114ec472a97a12409067b74ac0dc (patch)
tree19c16f5db5a78699200253d35ce390c429f76126 /gcc/tree-ssa-alias.c
parent8535d5aa16a895ba54ddb9c9453f093ad42f505e (diff)
downloadgcc-39c0aa5f74be114ec472a97a12409067b74ac0dc.zip
gcc-39c0aa5f74be114ec472a97a12409067b74ac0dc.tar.gz
gcc-39c0aa5f74be114ec472a97a12409067b74ac0dc.tar.bz2
compiler, runtime, reflect: generate unique type descriptors
Currently, the compiler already generates common symbols for type descriptors, so the type descriptors are unique. However, when a type is created through reflection, it is not deduplicated with compiler-generated types. As a consequence, we cannot assume type descriptors are unique, and cannot use pointer equality to compare them. Also, when constructing a reflect.Type, it has to go through a canonicalization map, which introduces overhead to reflect.TypeOf, and lock contentions in concurrent programs. In order for the reflect package to deduplicate types with compiler-created types, we register all the compiler-created type descriptors at startup time. The reflect package, when it needs to create a type, looks up the registry of compiler-created types before creates a new one. There is no lock contention since the registry is read-only after initialization. This lets us get rid of the canonicalization map, and also makes it possible to compare type descriptors with pointer equality. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/179598 From-SVN: r271894
Diffstat (limited to 'gcc/tree-ssa-alias.c')
0 files changed, 0 insertions, 0 deletions