On Wed, Aug 10, 2011 at 10:48 AM, Pedro Alves <pe...@codesourcery.com> wrote: > On Wednesday 10 August 2011 01:02:50, Steve Ellcey wrote: >> On Tue, 2011-08-09 at 16:50 -0700, Richard Henderson wrote: >> > > >> > > I think I like using a union to ensure the alignment of checksum better. >> > > In dwarf2out.c we are always using one md5_ctx structure and one >> > > checksum buffer but in fold-const.c there are routines where we use one >> > > md5_ctx structure with 4 (fold_build2_stat_loc) or 6 >> > > (fold_build3_stat_loc) different checksum buffers. >> > >> > I'm not keen on this. >> > >> > Yes, it does happen to work, but only accidentally. The CTX >> > object and the CHECKSUM object have overlapping lifetimes >> > within md5_read_ctx. >> > >> > >> > r~ >> >> I am not proposing we put the CTX object and the CHECKSUM object into >> one union. I am proposing we leave the CTX object alone and put the >> CHECKSUM object in a union with a dummy variable of type md5_uint32 in >> order to ensure that the CHECKSUM object has the correct alignment. >> >> So the usage would be: >> >> union md5_resbuf >> { >> md5_uint32 dummy; /* Unused variable used to ensure >> alignment */ >> unsigned char resbuf[16]; /* The buffer we are using in >> md5_finish_ctx */ >> }; > > Or even > > union md5_resbuf > { > md5_uint32 ui32[4]; > unsigned char ui8[16]; > }; > > and put it in include/md5.h instead, so that all clients > can use it instead of cooking up the same themselves. > liberty's md5.c itself internaly could be make to use the > union instead of the casts? > > *looks for users of md5* > > but then, gold does: > > unsigned char* ov = of->get_output_view(this->build_id_note_->offset(), > this->build_id_note_->data_size()); > > const char* style = parameters->options().build_id(); > if (strcmp(style, "sha1") == 0) > { > sha1_ctx ctx; > sha1_init_ctx(&ctx); > sha1_process_bytes(iv, this->output_file_size_, &ctx); > sha1_finish_ctx(&ctx, ov); > } > else if (strcmp(style, "md5") == 0) > { > md5_ctx ctx; > md5_init_ctx(&ctx); > md5_process_bytes(iv, this->output_file_size_, &ctx); > md5_finish_ctx(&ctx, ov); > > which makes me wonder if the right fix isn't to change > libiberty internally to not rely on the alignment.
I think that would be the best fix. It hardly can be a performance critical part - libiberty could use a local aligned buffer for compute and do a copy on return. Richard. > libiberty's sha1 routines seem to have the same issue > (though they don't appear used in gcc. gold uses them, as > seen above). > > -- > Pedro Alves >