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