+ // For symbol=symbol assignments, we need to track the type, visibility,
+ // and remaining st_other bits.
+ eei.type_pointer = type_pointer;
+ eei.vis_pointer = vis_pointer;
+ eei.nonvis_pointer = nonvis_pointer;
+
+ eei.result_alignment_pointer = result_alignment_pointer;
+
+ // Assume the value is valid until we try to evaluate an expression
+ // that can't be evaluated yet.
+ bool is_valid = true;
+ eei.is_valid_pointer = &is_valid;
+
+ uint64_t val = this->value(&eei);
+
+ if (is_valid_pointer != NULL)
+ *is_valid_pointer = is_valid;
+ else
+ gold_assert(is_valid);
+
+ // If this is an assignment to dot within a section, and the value
+ // is absolute, treat it as a section-relative offset.
+ if (is_section_dot_assignment && *result_section_pointer == NULL)
+ {
+ gold_assert(dot_section != NULL);
+ val += dot_section->address();
+ *result_section_pointer = dot_section;
+ }
+ return val;