svn commit: r293724 - in head/sys/boot: arm64/libarm64 common efi/boot1 efi/fdt efi/include efi/include/arm64 efi/libefi efi/loader efi/loader/arch/amd64 efi/loader/arch/arm efi/loader/arch/arm64 i...
Bruce Evans
brde at optusnet.com.au
Wed Jan 13 02:57:23 UTC 2016
On Tue, 12 Jan 2016, Ian Lepore wrote:
> On Wed, 2016-01-13 at 01:17 +0000, Steven Hartland wrote:
>>
>> On 13/01/2016 00:54, Ian Lepore wrote:
>>> On Wed, 2016-01-13 at 00:43 +0000, Steven Hartland wrote:
>>> ...
>>>> Passes a full tinderbox so I assume your forcing gcc for some
>>>> reason?
>>> For several reasons. The fact that gcc isn't the default compiler
>>> doesn't mean that it's okay for code to not compile with gcc; it's
>>> still a supported compiler for arm.
I usually force gcc.
>> Not disagreeing with that, was just curious that's all ;-)
>>
>> The warnings you list seem to be detail, typical gcc, specifically:
>>
>> sys/boot/efi/fdt/../include/efiapi.h:535: warning: function
>> declaration isn't a prototype
>>
>> I'm guessing its being picky and wants EFI_RESERVED_SERVICE to have
>> void in there due to no params.
It is not broken, so it is warning about an unprototyped function as
requested by -Wstrict-prototypes.
>> Does the following help:
>>
>> Index: sys/boot/efi/fdt/Makefile
>> ===================================================================
>> --- sys/boot/efi/fdt/Makefile (revision 293796)
>> +++ sys/boot/efi/fdt/Makefile (working copy)
>> @@ -7,6 +7,8 @@
>> LIB= efi_fdt
>> INTERNALLIB=
>> WARNS?= 6
>> +CWARNFLAGS.gcc+= -Wno-strict-prototypes
>> +CWARNFLAGS.gcc+= -Wno-redundant-decls
>>
>> SRCS= efi_fdt.c
>>
This just breaks the warning.
>> @@ -34,4 +36,6 @@ CLEANFILES+= machine
>>
>> .include <bsd.lib.mk>
>>
>> +CFLAGS+= ${CWARNFLAGS.${COMPILER_TYPE}}
>> +
>> beforedepend ${OBJS}: machine
>>
>> Could you detail detail how you're switching to gcc so I an run a
>> full pass on that too?
Sometimes I use CC=gccNN, where gccNN is somwhere in $PATH. Sometimes
it is a script to select an arch-dependent gcc. This is unlikely to
work for makeworld but it works for kernels.
> Yep, but then I had to do this because ef->off is 64 bits even on 32
> bit arches, so I got a pointer/int size mismatch warning...
gcc detects this error too.
> Index: common/load_elf.c
> ===================================================================
> --- common/load_elf.c (revision 293796)
> +++ common/load_elf.c (working copy)
> @@ -886,7 +886,7 @@ __elfN(parse_modmetadata)(struct preloaded_file *f
> error = __elfN(reloc_ptr)(fp, ef, v, &md, sizeof(md));
> if (error == EOPNOTSUPP) {
> md.md_cval += ef->off;
> - md.md_data = (void *)((uintptr_t)md.md_data + ef->off);
> + md.md_data = (void *)(uintptr_t)((uintptr_t)md.md_data +
> ef->off);
> } else if (error != 0)
> return (error);
> #endif
>
>
> That is just some special kind of ugly. Fixing warnings is supposed to
> lead to better code, but all this casting isn't better, it's just an
> unreadable mess. Man I miss the days when C was just a really powerful
> macro assembler. :)
This is made extra-ugly by misformatting it. Fixing warnings
unfortunately usually leads to worse code, using extra code to break
the warning.
Here the detected bug is the bogus type for ef->off. Values >=
UINT32_MAX in it cannot work in expressions like this. This was only
detected accidentally.
md_data is a very confusing variable name. It is used nearby in 4 structs
band has a different type in each. Sometimes it is uint32_t or
uint64_t; sometimes it is void * and sometimes it is char *. Here it
is void *.
Some of the structs are:
- mod_medadata (md is this); type void *
- mod_metadata64; type uint64_t
- mod_metadata32; type uint32_t
- file_metadata; type char []
The prefix is supposed to be unique in context. One is better than none.
'off' in ef has none.
The void * type is inconvenient to work with. The nearby md_cval has
the same bugs, except it isn't in file_metadata and its type is
const char * so you can add an integer to it without casting. The
previous round of fixes was to fix a warning about using the gnu
extension of adding an integer to a void * without a cast.
> + md.md_data = (void *)(uintptr_t)((uintptr_t)md.md_data +
> ef->off);
I don't see any better quick fix than changing 'off' to vm_offset_t
or maybe signed vm_offset_t. It is in a local struct so this seems
to be possible. Changing the void * instance of md_data to an integer
is harder.
md_cval should also be an integer.
Bruce
More information about the svn-src-all
mailing list