Bug 198014 - aarch64: ‘JSC::ARM64Assembler::LinkRecord::<unnamed union>::RealTypes::m_compareRegister’ is too small to hold all values of ‘JSC::ARM64Assembler::RegisterID’ {aka ‘enum JSC::ARM64Registers::RegisterID’}
Summary: aarch64: ‘JSC::ARM64Assembler::LinkRecord::<unnamed union>::RealTypes::m_comp...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: WebKit Nightly Build
Hardware: PC Linux
: P2 Normal
Assignee: Michael Catanzaro
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-05-18 08:36 PDT by Michael Catanzaro
Modified: 2019-06-06 06:42 PDT (History)
11 users (show)

See Also:


Attachments
Patch (2.07 KB, patch)
2019-06-05 13:29 PDT, Michael Catanzaro
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Catanzaro 2019-05-18 08:36:03 PDT
Building 2.24.1 (or maybe 2.24.2, not exactly sure tbh) on aarch64 we have a tremendous warning spam:

[1452/2817] Building CXX object Source/JavaScriptCore/CMakeFiles/JavaScriptCore.dir/__/__/DerivedSources/JavaScriptCore/unified-sources/UnifiedSource-02aa2997-2.cpp.o
In file included from ../Source/JavaScriptCore/assembler/MacroAssemblerARM64.h:30,
                 from ../Source/JavaScriptCore/assembler/MacroAssembler.h:46,
                 from ../Source/JavaScriptCore/runtime/BasicBlockLocation.h:30,
                 from ../Source/JavaScriptCore/runtime/ControlFlowProfiler.h:29,
                 from ../Source/JavaScriptCore/runtime/VM.h:35,
                 from ../Source/JavaScriptCore/interpreter/CallFrame.h:30,
                 from ../Source/JavaScriptCore/bytecode/VirtualRegister.h:29,
                 from ../Source/JavaScriptCore/ftl/FTLExitArgumentForOperand.h:31,
                 from ../Source/JavaScriptCore/ftl/FTLExitArgumentForOperand.cpp:27,
                 from DerivedSources/JavaScriptCore/unified-sources/UnifiedSource-02aa2997-2.cpp:1:
../Source/JavaScriptCore/assembler/ARM64Assembler.h:465:48: warning: ‘JSC::ARM64Assembler::LinkRecord::<unnamed union>::RealTypes::m_compareRegister’ is too small to hold all values of ‘JSC::ARM64Assembler::RegisterID’ {aka ‘enum JSC::ARM64Registers::RegisterID’}
                 RegisterID m_compareRegister : 6;
                                                ^
Comment 1 Michael Catanzaro 2019-06-02 07:15:40 PDT
This is making it extremely difficult to find build errors.
Comment 2 Michael Catanzaro 2019-06-05 13:24:03 PDT
CCing people who have touched this code before. Looks like this is a sequel to bug #135906. The enum is:

typedef enum : int8_t {
    // Parameter/result registers.
    x0,
    x1,
    x2,
    x3,
    x4,
    x5,
    x6,
    x7,
    // Indirect result location register.
    x8,
    // Temporary registers.
    x9,
    x10,
    x11,
    x12,
    x13,
    x14,
    x15,
    // Intra-procedure-call scratch registers (temporary).
    x16,
    x17,
    // Platform Register (temporary).
    x18,
    // Callee-saved.
    x19,
    x20,
    x21,
    x22,
    x23,
    x24,
    x25,
    x26,
    x27,
    x28,
    // Special.
    fp,
    lr,
    sp,

    ip0 = x16,
    ip1 = x17,
    x29 = fp,
    x30 = lr,
    zr = 0x3f, // <-- problem is here
    InvalidGPRReg = -1,
} RegisterID;

The bitfield is six bits large, so only 32 values are allowed. But 0x3f is 63 decimal. It just doesn't fit. I think actually only 16 nonnegative values are allowed, because it's signed. So yeah, I don't understand how this could work properly without clobbering.

Expanding the bitfield to seven bits is not enough. 8 bits makes the warning go away.

We might not want it to be a bitfield at all at 8 bits, since it's an int8_t enum anyway, but just changing it to eight bits suffices.
Comment 3 Michael Catanzaro 2019-06-05 13:28:07 PDT
Ah, I tried just changing : 6 to : 8, but style checker hates it:

ERROR: Source/JavaScriptCore/assembler/ARM64Assembler.h:465:  Please declare enum bitfields as unsigned integral types.  [runtime/enum_bitfields] [5

Better not use a bitfield, then.
Comment 4 Michael Catanzaro 2019-06-05 13:29:24 PDT
Created attachment 371434 [details]
Patch
Comment 5 Yusuke Suzuki 2019-06-05 14:54:20 PDT
Comment on attachment 371434 [details]
Patch

r=me. If we can shrink LinkRecord, we should represent the register in a bit fields, but in this case, it does not matter much, sizeof(LinkedRecord) does not change.
Comment 6 WebKit Commit Bot 2019-06-06 06:41:27 PDT
Comment on attachment 371434 [details]
Patch

Clearing flags on attachment: 371434

Committed r246151: <https://trac.webkit.org/changeset/246151>
Comment 7 WebKit Commit Bot 2019-06-06 06:41:29 PDT
All reviewed patches have been landed.  Closing bug.