You are correct if all enums are blindly recasted to UINT32. The purpose
of my example was to show typical compiler behavior and how enums can
correctly be used as signed or unsigned. How ever in this case where the
enum is greater/less than compared against a constant that borders what is
considered a negative number a recast is required to work for all
compilers/use cases. Enums are handy for debugging but do have this
ambiguity problem and since it is one of many enums defined in the UEFI
spec it would require a change the spec.
The two best choices from a programming point are:
(UINT32)(EFI_MEMORY_TYPE) <= 0x7fffffff (as suggested) or
(INT32)(EFI_MEMORY_TYPE) < 0 (as seen Pool.c::131).
At the assembly level both of these equate to the same thing.
--Joe
On Sun, Jan 20, 2013 at 3:42 PM, Isakov Sergey <isakov...@bk.ru> wrote:
> Hi,
> If we will always cast enum to UINT32 then in your sample we get e_*s_neg
> > e_s_pos*
> while without cast *e_s_neg < e_s_pos*.
> It is not a method to work.
> EFI_MEMORY_TYPE must be defined as INT32 but not questionable enum.
>
> Sergey
>
> On 21.01.2013, at 0:18, Joe Vernaci wrote:
>
> Hi Nikolai,
>
> I think your recast as a UINT32 is the correct change. From the UEFI spec
> 6.2 when allocating "MemoryType values in the range 0x80000000..0xFFFFFFFF
> are reserved for use by UEFI OS loaders that are provided by operating
> system vendors. The only illegal memory type values are those in the range
> EfiMaxMemoryType..0x7FFFFFFF."
>
> ANSI and ISO C state that named enumeration constants must be type
> (signed) int but may be physically stored as either signed int or unsigned
> int which is implementation specific (ISO 9998:201x 6.7.2.2). Some people
> interpret this as enums must always be signed int. However the norm seems
> to be treat it as unsigned unless a negative constant is used in the enum
> definition. If your compiler is treating this enum as a signed int then
> yes PoolType will always be less than 0x7fffffff. If you have not changed
> the EFI_MEMORY_TYPE definition using a negative I'm not sure why it is
> doing this.
>
> Here is a simple example:
> #include <stdio.h>
>
> typedef enum {
> e_s_neg_1 = -1, // <-- valid
> e_s_pos_1 = 1,
> e_s_pos_2 = 2
> } e_s;
>
> typedef enum {
> e_u_pos_1 = 1,
> e_u_pos_2 = 2
> } e_u;
>
> typedef enum {
> e_und_0,
> e_und_pos_1
> } e_und;
>
> typedef enum {
> e_inv_pos_1 = 1,
> e_inv_pos_2 = 2,
> e_inv_neg_1 = 0xffffffff // <-- invalid but same value as (-1)
> } e_inv;
>
> void func_s(e_s e) {
> if (e <= 0x7fffffff) { // <-- should use test/jns or cmp/jg
> printf("func_s: 0x%08x\n", e);
> }
> }
>
> void func_u(e_u e) {
> if (e <= 0x7fffffff) { // <-- should use test/js or cmp/ja
> printf("func_u: 0x%08x\n", e);
> }
> }
>
> void func_und(e_und e) {
> if (e <= 0x7fffffff) { // <-- should use test/js or cmp/ja
> printf("func_und: 0x%08x\n", e);
> }
> }
>
> void func_inv(e_inv e) {
> if (e <= 0x7fffffff) { // <-- should use test/js or cmp/ja
> printf("func_inv: 0x%08x\n", e);
> }
> }
>
> int main(int argc, char **argv) {
> func_s(-1); // <-- only function that should print
> func_u(-1);
> func_und(-1);
> func_inv(-1);
> return 0;
> }
>
> --Joe
>
> On Sat, Jan 19, 2013 at 1:19 AM, Nikolai Saoukh <n...@otdel-1.org> wrote:
>
>> I just added handcrafted toolchain (ELFCLANG) to Conf/tools_def.txt.
>> And tried to compile DuetPkg -- DEBUG & IA32. Command lines follows
>>
>> "clang" -ffreestanding -m32 -fshort-wchar -fno-strict-aliasing -Wall
>> -c -include
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/AutoGen.h
>> -D
>> STRING_ARRAY_NAME=DxeCoreStrings -o
>>
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Pool.obj
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/DxeMain
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Dispatcher
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Event
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/FwVol
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/FwVolBlock
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Mem
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Gcd
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Hand
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Library -I/tiano/edk2/
>> MdeModulePkg/Core/Dxe/Misc -I/tiano/edk2/MdeModulePkg/Core/Dxe/Image
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/SectionExtraction
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe -I/tiano/edk2/Build/
>> DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/DEBUG
>> -I/tiano/edk2/MdePkg -I/tiano/edk2/MdePkg/Include
>> -I/tiano/edk2/MdePkg/Include/Ia32 -I/tiano/edk2/MdeModulePkg
>> -I/tiano/edk2/MdeModulePkg/Include
>> /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Pool.c
>> /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Pool.c:188:49: warning:
>> comparison of constant 2147483647 with expression of type
>> 'EFI_MEMORY_TYPE' is always true [-Wtautological-constant-o
>> ut-of-range-compare]
>> if ((PoolType >= EfiMaxMemoryType && PoolType <= 0x7fffffff) ||
>> ~~~~~~~~ ^ ~~~~~~~~~~
>> 1 warning generated.
>> "echo" Symbol renaming not needed for
>>
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Pool.obj
>> Symbol renaming not needed for
>>
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Pool.obj
>> "clang" -ffreestanding -m32 -fshort-wchar -fno-strict-aliasing -Wall
>> -c -include
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/DEBUG/AutoGen.h
>> -DSTRING_ARRAY_NAME=DxeCoreStrings -o
>>
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Page.obj
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/DxeMain
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Dispatcher
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Event
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/FwVol
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/FwVolBlock
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Mem
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Gcd
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Hand
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Library
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Misc
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/Image
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe/SectionExtraction
>> -I/tiano/edk2/MdeModulePkg/Core/Dxe
>>
>> -I/tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/DEBUG
>> -I/tiano/edk2/MdePkg -I/tiano/edk2/MdePkg/Include
>> -I/tiano/edk2/MdePkg/Include/Ia32 -I/tiano/edk2/MdeModulePkg
>> -I/tiano/edk2/MdeModulePkg/Include
>> /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Page.c
>> /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Page.c:528:40: warning:
>> comparison of constant 2147483647 with expression of type
>> 'EFI_MEMORY_TYPE' is always true
>> [-Wtautological-constant-out-of-range-compare]
>> if (Type >= EfiMaxMemoryType && Type <= 0x7fffffff) {
>> ~~~~ ^ ~~~~~~~~~~
>> /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Page.c:1101:53: warning:
>> comparison of constant 2147483647 with expression of type
>> 'EFI_MEMORY_TYPE' is always true
>> [-Wtautological-constant-out-of-range-compare]
>> if ((MemoryType >= EfiMaxMemoryType && MemoryType <= 0x7fffffff) ||
>> ~~~~~~~~~~ ^ ~~~~~~~~~~
>> 2 warnings generated.
>> "echo" Symbol renaming not needed for
>>
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Page.obj
>> Symbol renaming not needed for
>>
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_ELFCLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Page.obj
>>
>>
>> On Wed, Jan 16, 2013 at 6:21 AM, Tian, Feng <feng.t...@intel.com> wrote:
>> > Hi, Saoukh
>> >
>> >
>> >
>> > What tool-chain and build option are you using? Are you changing
>> > tools_def.txt in Conf directory?
>> >
>> > Could you paste the entire command line of building this .c file to us?
>> >
>> >
>> >
>> > Thanks
>> >
>> > Feng
>> >
>> >
>> >
>> > From: Nikolai Saoukh [mailto:n...@otdel-1.org]
>> > Sent: Tuesday, January 15, 2013 22:27
>> >
>> >
>> > To: edk2-devel@lists.sourceforge.net
>> > Subject: [edk2] tautological-constant-out-of-range-compare
>> >
>> >
>> >
>> > This particular case was discussed already
>> >
>> >
>> >
>> > /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Pool.c:188:49: error: comparison
>> of
>> > constant 2147483647 with expression of type 'EFI_MEMORY_TYPE' is
>> always true
>> > [-Werror,-Wtautological-constant-out-of-range-compare]
>> >
>> > if ((PoolType >= EfiMaxMemoryType && PoolType <= 0x7fffffff) ||
>> >
>> > ~~~~~~~~ ^ ~~~~~~~~~~
>> >
>> >
>> >
>> > /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Page.c:528:40: error: comparison
>> of
>> > constant 2147483647 with expression of type 'EFI_MEMORY_TYPE' is
>> always true
>> > [-Werror,-Wtautological-constant-out-of-range-compare]
>> >
>> > if (Type >= EfiMaxMemoryType && Type <= 0x7fffffff) {
>> >
>> > ~~~~ ^ ~~~~~~~~~~
>> >
>> >
>> >
>> > .................
>> >
>> >
>> >
>> > "i686-pc-mingw32-objcopy" --redefine-sym _memcpy=_CopyMem --redefine-sym
>> > _memset=_SetMem
>> >
>> /tiano/edk2/Build/DuetPkgIA32/DEBUG_PECLANG/IA32/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/Mem/Pool.obj
>> >
>> > /tiano/edk2/MdeModulePkg/Core/Dxe/Mem/Page.c:1101:53: error: comparison
>> of
>> > constant 2147483647 with expression of type 'EFI_MEMORY_TYPE' is
>> always true
>> > [-Werror,-Wtautological-constant-out-of-range-compare]
>> >
>> > if ((MemoryType >= EfiMaxMemoryType && MemoryType <= 0x7fffffff) ||
>> >
>> > ~~~~~~~~~~ ^ ~~~~~~~~~~
>> >
>> >
>> >
>> >
>> >
>> > I guess it should be written like this
>> >
>> >
>> >
>> > if ((PoolType >= EfiMaxMemoryType && ((UINT32)PoolType <= 0x7fffffff))
>> ...
>> >
>> >
>> >
>> ------------------------------------------------------------------------------
>> > Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery
>> > and much more. Keep your Java skills current with LearnJavaNow -
>> > 200+ hours of step-by-step video tutorials by Java experts.
>> > SALE $49.99 this month only -- learn more at:
>> > http://p.sf.net/sfu/learnmore_122612
>> > _______________________________________________
>> > edk2-devel mailing list
>> > edk2-devel@lists.sourceforge.net
>> > https://lists.sourceforge.net/lists/listinfo/edk2-devel
>> >
>>
>>
>> ------------------------------------------------------------------------------
>> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
>> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
>> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
>> MVPs and experts. SALE $99.99 this month only -- learn more at:
>> http://p.sf.net/sfu/learnmore_122912
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>>
>
>
> ------------------------------------------------------------------------------
> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
> MVPs and experts. ON SALE this month only -- learn more at:
>
> http://p.sf.net/sfu/learnmore_123012_______________________________________________
>
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
>
>
> ------------------------------------------------------------------------------
> Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
> MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
> with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
> MVPs and experts. ON SALE this month only -- learn more at:
> http://p.sf.net/sfu/learnmore_123012
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
>
>
------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. ON SALE this month only -- learn more at:
http://p.sf.net/sfu/learnmore_123012
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel