+/* Return true if TREE is '.'. */
+
+static bfd_boolean
+is_dot (const etree_type *tree)
+{
+ return (tree->type.node_class == etree_name
+ && tree->type.node_code == NAME
+ && tree->name.name[0] == '.'
+ && tree->name.name[1] == 0);
+}
+
+/* Return true if TREE is a constant equal to VAL. */
+
+static bfd_boolean
+is_value (const etree_type *tree, bfd_vma val)
+{
+ return (tree->type.node_class == etree_value
+ && tree->value.value == val);
+}
+
+/* Return true if TREE is an absolute symbol equal to VAL defined in
+ a linker script. */
+
+static bfd_boolean
+is_sym_value (const etree_type *tree, bfd_vma val)
+{
+ struct bfd_link_hash_entry *h;
+ struct definedness_hash_entry *def;
+
+ return (tree->type.node_class == etree_name
+ && tree->type.node_code == NAME
+ && (def = symbol_defined (tree->name.name)) != NULL
+ && def->by_script
+ && def->iteration == (lang_statement_iteration & 1)
+ && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd,
+ &link_info,
+ tree->name.name,
+ FALSE, FALSE, TRUE)) != NULL
+ && h->type == bfd_link_hash_defined
+ && h->u.def.section == bfd_abs_section_ptr
+ && h->u.def.value == val);
+}
+
+/* Return true if TREE is ". != 0". */
+
+static bfd_boolean
+is_dot_ne_0 (const etree_type *tree)
+{
+ return (tree->type.node_class == etree_binary
+ && tree->type.node_code == NE
+ && is_dot (tree->binary.lhs)
+ && is_value (tree->binary.rhs, 0));
+}
+
+/* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an
+ absolute constant with value 0 defined in a linker script. */
+
+static bfd_boolean
+is_dot_plus_0 (const etree_type *tree)
+{
+ return (tree->type.node_class == etree_binary
+ && tree->type.node_code == '+'
+ && is_dot (tree->binary.lhs)
+ && (is_value (tree->binary.rhs, 0)
+ || is_sym_value (tree->binary.rhs, 0)));
+}
+
+/* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)". */
+
+static bfd_boolean
+is_align_conditional (const etree_type *tree)
+{
+ if (tree->type.node_class == etree_unary
+ && tree->type.node_code == ALIGN_K)
+ {
+ tree = tree->unary.child;
+ return (tree->type.node_class == etree_trinary
+ && is_dot_ne_0 (tree->trinary.cond)
+ && is_value (tree->trinary.rhs, 1));
+ }
+ return 0;
+}
+