This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gold] Merging string literals with bigger alignment


+  // We assume here that the beginning of the section is correctly
+  // aligned, so each string within the section must retain the same
+  // modulo.
+  uint64_t init_align_modulo = (uint64_t) pdata % this->addralign();

The view you're looking at will already be aligned correctly, so I
don't think this is necessary (i.e., init_align_modulo will always be
0).

+  if ((uint64_t) p % this->addralign() != init_align_modulo)
+    gold_warning(_("string %s is incorrectly aligned within"
+   " the section %s. Its alignment won't be preserved"),
+ (unsigned char*)p,
+ object->section_name(shndx).c_str());

If Char_type is not char, printing (unsigned char*)p with %s will not
work. Also, this cast should use reinterpret_cast<...>(p) instead of
the C-style cast.

I think you'll also need to change
Stringpool_template<Stringpool_char>::Stringpool_eq::operator() to
check the alignment that you've stored in the Hashkey. Imagine one
section that adds a string with alignment 1, and a subsequent section
that adds the same string with alignment 4 -- when adding the string
the second time, you'll match the first, and keep the 1-byte
alignment. Ideally, you'd just update the alignment so there's only
one copy of the string at the larger alignment, but that will only
work if you're optimizing the string tables (-O2).

-cary


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]