diff options
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/c-tree.texi | 49 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 7 |
2 files changed, 56 insertions, 0 deletions
diff --git a/gcc/doc/c-tree.texi b/gcc/doc/c-tree.texi index b8a4faf..aa7b7e7 100644 --- a/gcc/doc/c-tree.texi +++ b/gcc/doc/c-tree.texi @@ -305,6 +305,9 @@ The elements are indexed from zero. @findex TYPENAME_TYPE_FULLNAME @findex TYPE_FIELDS @findex TYPE_PTROBV_P +@findex TYPE_CANONICAL +@findex TYPE_STRUCTURAL_EQUALITY_P +@findex SET_TYPE_STRUCTURAL_EQUALITY All types have corresponding tree nodes. However, you should not assume that there is exactly one tree node corresponding to each type. There @@ -406,6 +409,52 @@ does not hold for the generic pointer to object type @code{void *}. You may use @code{TYPE_PTROBV_P} to test for a pointer to object type as well as @code{void *}. +@item TYPE_CANONICAL +This macro returns the ``canonical'' type for the given type +node. Canonical types are used to improve performance in the C++ and +Objective-C++ front ends by allowing efficient comparison between two +type nodes in @code{same_type_p}: if the @code{TYPE_CANONICAL} values +of the types are equal, the types are equivalent; otherwise, the types +are not equivalent. The notion of equivalence for canonical types is +the same as the notion of type equivalence in the language itself. For +instance, + +When @code{TYPE_CANONICAL} is @code{NULL_TREE}, there is no canonical +type for the given type node. In this case, comparison between this +type and any other type requires the compiler to perform a deep, +``structural'' comparison to see if the two type nodes have the same +form and properties. + +The canonical type for a node is always the most fundamental type in +the equivalence class of types. For instance, @code{int} is its own +canonical type. A typedef @code{I} of @code{int} will have @code{int} +as its canonical type. Similarly, @code{I*}@ and a typedef @code{IP}@ +(defined to @code{I*}) will has @code{int*} as their canonical +type. When building a new type node, be sure to set +@code{TYPE_CANONICAL} to the appropriate canonical type. If the new +type is a compound type (built from other types), and any of those +other types require structural equality, use +@code{SET_TYPE_STRUCTURAL_EQUALITY} to ensure that the new type also +requires structural equality. Finally, if for some reason you cannot +guarantee that @code{TYPE_CANONICAL} will point to the canonical type, +use @code{SET_TYPE_STRUCTURAL_EQUALITY} to make sure that the new +type--and any type constructed based on it--requires structural +equality. If you suspect that the canonical type system is +miscomparing types, pass @code{--param verify-canonical-types=1} to +the compiler or configure with @code{--enable-checking} to force the +compiler to verify its canonical-type comparisons against the +structural comparisons; the compiler will then print any warnings if +the canonical types miscompare. + +@item TYPE_STRUCTURAL_EQUALITY_P +This predicate holds when the node requires structural equality +checks, e.g., when @code{TYPE_CANONICAL} is @code{NULL_TREE}. + +@item SET_TYPE_STRUCTURAL_EQUALITY +This macro states that the type node it is given requires structural +equality checks, e.g., it sets @code{TYPE_CANONICAL} to +@code{NULL_TREE}. + @item same_type_p This predicate takes two types as input, and holds if they are the same type. For example, if one type is a @code{typedef} for the other, or diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8fa9aa9..ff463c7 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -6383,6 +6383,13 @@ The size of cache line in L1 cache, in bytes. @item l1-cache-size The number of cache lines in L1 cache. +@item verify-canonical-types +Whether the compiler should verify the ``canonical'' types used for +type equality comparisons within the C++ and Objective-C++ front +ends. Set to 1 (the default when GCC is configured with +--enable-checking) to enable verification, 0 to disable verification +(the default when GCC is configured with --disable-checking). + @end table @end table |