Closed Bug 1629791 Opened 1 month ago Closed 1 month ago

Auto-generate CacheIR boilerplate

Categories

(Core :: JavaScript Engine, task, P2)

task

Tracking

()

RESOLVED FIXED
mozilla77
Tracking Status
firefox77 --- fixed

People

(Reporter: jandem, Assigned: jandem)

References

(Blocks 1 open bug)

Details

Attachments

(26 files)

47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review
47 bytes, text/x-phabricator-request
Details | Review

We should try to move the CacheIR definitions into a Python script, so that we can auto-generate some C++ headers for things like:

  • Instruction-specific parts of CacheIRWriter
  • Method definitions for CacheIRCompiler and WarpCacheIRTranspiler that get passed the operands as arguments instead of requiring manual reader.readFoo() calls.
  • A CacheIR logger, useful for WarpCacheIR::dumpData.
Priority: -- → P2
Keywords: leave-open

Most other generated SpiderMonkey files have the 'Generated' suffix too so let's
follow that convention.

For now this generates just CACHE_IR_OPS and CACHE_IR_SHARED_OPS in CacheIROpsGenerated.h
but the plan is to use this to generate parts of the IR writer and compiler/transpiler
interface. The spewer could also potentially be improved now that each operand has a name
and more precise type.

Generating the IR writer will likely happen incrementally so that will give us
another chance to double check the precise types match what's in the YAML file.

Depends on D70994

Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/c98945218181
part 1 - Rename MOpcodes.h to MOpcodesGenerated.h and LOpcodes to LOpcodesGenerated.h. r=iain
https://hg.mozilla.org/integration/autoland/rev/bf1ac8000d98
part 2 - Remove unnecessary condition operand from GuardSpecificInt32Immediate. r=iain
https://hg.mozilla.org/integration/autoland/rev/ae75073d8f75
part 3 - Define CacheIR ops in a YAML file and use that to generate a header file. r=iain

For ops that are implemented in the base class, we used to generate an emitFoo
implementation in BaselineCacheIRCompiler and IonCacheIRCompiler that forwarded
to the base class method.

Now that we can easily codegen, it's nicer to generate a list of unshared ops
and use it so that we can call the base class methods directly. This generates
a lot less C++ code in the CacheIR compilers and is easier on the C++ compiler.

Eventually both the shared and unshared lists will be replaced with generated
boilerplate, but for now this is an improvement.

For ops with the gen_boilerplate attribute, this auto-generates the writer and compiler
boilerplate code. The attribute has been added to some arbitrary ops to test this.

CacheIRWriter methods that return a new OperandId are not supported yet.

Initially I wanted to generate multiple header files and classes, but the current
approach works fine and is probably a bit easier to reason about. Because the
code generation itself is pretty simple it should be easy to experiment with different
codegen strategies in the future.

The PropertyNameField type behaves just like StringField, except the generated writer
method takes a PropertyName* instead of JSString* for better type safety.

Depends on D71283

Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/219a8f2d153f
part 4 - Stop generating implementations forwarding to the base class. r=iain
https://hg.mozilla.org/integration/autoland/rev/667744615032
part 5 - Auto-generate CacheIRWriter and CacheIRCompiler code for a handful of ops. r=iain

RawWordField had to be split in RawWordField (writer takes uintptr_t) and
RawPointerField (writer takes const void*).

Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/f4e8a57794bd
part 6 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/3622d13a47ba
part 7 - Auto-generate boilerplate for more ops. r=tcampbell
https://hg.mozilla.org/integration/autoland/rev/1b564951f425
part 8 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/2171f97d659b
part 9 - Auto-generate boilerplate for more ops. r=evilpie
https://hg.mozilla.org/integration/autoland/rev/6edde7bdb088
part 10 - Auto-generate boilerplate for more ops. r=tcampbell
Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/31756f82b699
part 11 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/ef3ad9976f50
part 12 - Auto-generate boilerplate for more ops. r=evilpie
https://hg.mozilla.org/integration/autoland/rev/0bede83bebb6
part 13 - Auto-generate boilerplate for more ops. r=mgaudet

Backed out 3 changesets (bug 1629791) for bustages complaining about CacheIR.h

Push with failures: https://treeherder.mozilla.org/#/jobs?repo=autoland&fromchange=0bede83bebb6eccda9639666f2e37cc313e6d7b8&tochange=ee7a427d7af1ccb7ab79fb8ac869e4a8f647f77e&searchStr=build&selectedJob=298286274

Backout link: https://hg.mozilla.org/integration/autoland/rev/ee7a427d7af1ccb7ab79fb8ac869e4a8f647f77e

Failure log: https://treeherder.mozilla.org/logviewer.html#/jobs?job_id=298286274&repo=autoland&lineNumber=8688

[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -  make[4]: Entering directory '/builds/worker/workspace/obj-build/js/src/jit'
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -  /builds/worker/fetches/sccache/sccache /builds/worker/fetches/gcc/bin/g++ -std=gnu++17 -o Unified_cpp_js_src_jit0.o -c  -I/builds/worker/workspace/obj-build/dist/system_wrappers -include /builds/worker/checkouts/gecko/config/gcc_hidden.h -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fstack-protector-strong -DDEBUG=1 -DWASM_SUPPORTS_HUGE_MEMORY -DJS_CACHEIR_SPEW -DJS_STRUCTURED_SPEW -DJS_HAS_CTYPES -DFFI_BUILDING -DEXPORT_JS_API -DMOZ_HAS_MOZGLUE -I/builds/worker/checkouts/gecko/js/src/jit -I/builds/worker/workspace/obj-build/js/src/jit -I/builds/worker/workspace/obj-build/js/src -I/builds/worker/checkouts/gecko/js/src -I/builds/worker/workspace/obj-build/dist/include -I/builds/worker/workspace/obj-build/dist/include/nspr -fPIC -DMOZILLA_CLIENT -include /builds/worker/workspace/obj-build/js/src/js-confdefs.h -Wall -Wempty-body -Wignored-qualifiers -Woverloaded-virtual -Wpointer-arith -Wsign-compare -Wtype-limits -Wunreachable-code -Wwrite-strings -Wno-invalid-offsetof -Wduplicated-cond -Wimplicit-fallthrough -Wunused-function -Wunused-variable -Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=coverage-mismatch -Wno-error=free-nonheap-object -Wformat -Wformat-overflow=2 -Wno-noexcept-type -D_GLIBCXX_USE_CXX11_ABI=0 -fno-sized-deallocation -fno-aligned-new -fno-rtti -ffunction-sections -fdata-sections -fno-exceptions -fno-math-errno -pthread -pipe -g -freorder-blocks -O3 -fno-omit-frame-pointer -funwind-tables -Werror -fno-strict-aliasing -Werror=format -Wno-shadow -Wno-attributes  -MD -MP -MF .deps/Unified_cpp_js_src_jit0.o.pp   Unified_cpp_js_src_jit0.cpp
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -  In file included from /builds/worker/workspace/obj-build/dist/include/mozilla/Array.h:17:0,
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -                   from /builds/worker/checkouts/gecko/js/src/jit/MIR.h:16,
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -                   from /builds/worker/checkouts/gecko/js/src/jit/AliasAnalysis.h:10,
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -                   from /builds/worker/checkouts/gecko/js/src/jit/AliasAnalysis.cpp:7,
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -                   from Unified_cpp_js_src_jit0.cpp:2:
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -  /builds/worker/checkouts/gecko/js/src/jit/CacheIR.h: In member function 'void js::jit::CacheIRWriter::loadTypedObjectResult(js::jit::ObjOperandId, uint32_t, js::jit::TypedThingLayout, uint32_t)':
[task 2020-04-19T13:15:38.583Z] 13:15:38    ERROR -  /builds/worker/checkouts/gecko/js/src/jit/CacheIR.h:1275:33: error: comparison is always true due to limited range of data type [-Werror=type-limits]
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -       MOZ_ASSERT(uint32_t(layout) <= UINT8_MAX);
[task 2020-04-19T13:15:38.583Z] 13:15:38     INFO -                                   ^
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:445:58: note: in definition of macro 'MOZ_VALIDATE_ASSERT_CONDITION_TYPE'
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -           mozilla::detail::AssertionConditionType<decltype(x)>::isValid, \
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -                                                            ^
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:482:31: note: in expansion of macro 'MOZ_ASSERT_HELPER1'
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -   #define MOZ_ASSERT_GLUE(a, b) a b
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -                                 ^
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:490:5: note: in expansion of macro 'MOZ_ASSERT_GLUE'
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -       MOZ_ASSERT_GLUE(                                                    \
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -       ^~~~~~~~~~~~~~~
[task 2020-04-19T13:15:38.585Z] 13:15:38     INFO -  /builds/worker/checkouts/gecko/js/src/jit/CacheIR.h:1275:5: note: in expansion of macro 'MOZ_ASSERT'
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -       MOZ_ASSERT(uint32_t(layout) <= UINT8_MAX);
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -       ^
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -  In file included from /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:18:0,
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                   from /builds/worker/workspace/obj-build/dist/include/mozilla/Array.h:17,
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                   from /builds/worker/checkouts/gecko/js/src/jit/MIR.h:16,
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                   from /builds/worker/checkouts/gecko/js/src/jit/AliasAnalysis.h:10,
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                   from /builds/worker/checkouts/gecko/js/src/jit/AliasAnalysis.cpp:7,
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                   from Unified_cpp_js_src_jit0.cpp:2:
[task 2020-04-19T13:15:38.586Z] 13:15:38    ERROR -  /builds/worker/checkouts/gecko/js/src/jit/CacheIR.h:1275:33: error: comparison is always true due to limited range of data type [-Werror=type-limits]
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -       MOZ_ASSERT(uint32_t(layout) <= UINT8_MAX);
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                                   ^
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Likely.h:17:48: note: in definition of macro 'MOZ_UNLIKELY'
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -   #  define MOZ_UNLIKELY(x) (__builtin_expect(!!(x), 0))
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                                                  ^
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:464:23: note: in expansion of macro 'MOZ_CHECK_ASSERT_ASSIGNMENT'
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -       if (MOZ_UNLIKELY(!MOZ_CHECK_ASSERT_ASSIGNMENT(expr))) {    \
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:482:31: note: in expansion of macro 'MOZ_ASSERT_HELPER1'
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -   #define MOZ_ASSERT_GLUE(a, b) a b
[task 2020-04-19T13:15:38.586Z] 13:15:38     INFO -                                 ^
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -  /builds/worker/workspace/obj-build/dist/include/mozilla/Assertions.h:490:5: note: in expansion of macro 'MOZ_ASSERT_GLUE'
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -       MOZ_ASSERT_GLUE(                                                    \
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -       ^~~~~~~~~~~~~~~
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -  /builds/worker/checkouts/gecko/js/src/jit/CacheIR.h:1275:5: note: in expansion of macro 'MOZ_ASSERT'
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -       MOZ_ASSERT(uint32_t(layout) <= UINT8_MAX);
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -       ^
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -  cc1plus: all warnings being treated as errors
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -  /builds/worker/checkouts/gecko/config/rules.mk:750: recipe for target 'Unified_cpp_js_src_jit0.o' failed
[task 2020-04-19T13:15:38.587Z] 13:15:38    ERROR -  make[4]: *** [Unified_cpp_js_src_jit0.o] Error 1
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -  make[4]: Leaving directory '/builds/worker/workspace/obj-build/js/src/jit'
[task 2020-04-19T13:15:38.587Z] 13:15:38     INFO -  make[4]: *** Waiting for unfinished jobs....
Flags: needinfo?(jdemooij)
Flags: needinfo?(jdemooij)
Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/72a8b31446c5
part 11 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/ac8a7040a530
part 12 - Auto-generate boilerplate for more ops. r=evilpie
https://hg.mozilla.org/integration/autoland/rev/7c7f5c9ca443
part 13 - Auto-generate boilerplate for more ops. r=mgaudet

This adds support for instructions that return a new value. In this case the
CacheIRWriter returns a new id of this kind.

Depends on D71520

Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/1c58c2dfbcac
part 14 - Auto-generate boilerplate for more ops. r=evilpie
https://hg.mozilla.org/integration/autoland/rev/08d33b0602d6
part 15 - Auto-generate boilerplate for more ops. r=evilpie
https://hg.mozilla.org/integration/autoland/rev/ad647c87f939
part 16 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/a2cf06ed6d52
part 17 - Auto-generate boilerplate for more ops. r=tcampbell
https://hg.mozilla.org/integration/autoland/rev/b08f2511e2cc
part 18 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/ea5473ff6eb9
part 19 - Auto-generate boilerplate for more ops. r=evilpie
https://hg.mozilla.org/integration/autoland/rev/f1a789f5b8fd
part 20 - Auto-generate boilerplate for more ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/bf1fed0570d7
part 21 - Auto-generate boilerplate for more ops. r=evilpie

This adds the custom_writer attribute for ops that need custom writer code.
In this case the generated method is private and its name has a trailing _.

These are a bit special because the type of ths RHS is not statically know, so
we use RawId.

Depends on D71717

Reusing stub fields is a bit difficult with the code generator. I have a TODO
item to add some code to addStubField to do this dynamically.

Depends on D71718

Make the reader a local passed to the auto-generated emitFoo methods, instead
of exposing it to all CacheIRCompiler methods. This is nice because only
auto-generated code now has access to it.

This also removes the assertAllArgumentsConsumed mechanism because the reader
code is auto-generated from the same information.

Blocks: 1631920
Blocks: 1632067
Pushed by jdemooij@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/d53bf7023c65
part 22 - Auto-generate boilerplate for some ops with custom CacheIRWriter logic. r=iain
https://hg.mozilla.org/integration/autoland/rev/f2bfc40e38b6
part 23 - Auto-generate boilerplate for some TypedObject ops. r=iain
https://hg.mozilla.org/integration/autoland/rev/c3ba1ac51e15
part 24 - Auto-generate boilerplate for MetaTwoByte. r=iain
https://hg.mozilla.org/integration/autoland/rev/0804ac69cd9c
part 25 - Remove the gen_boilerplate attribute now that all ops have it. r=iain
https://hg.mozilla.org/integration/autoland/rev/ab943bedecaf
part 26 - Remove CacheIRReader field from CacheIRCompiler. r=iain

This is done. There's some follow-up work in bug 1632067 and we can now hook this up to the transpiler too.

Keywords: leave-open
Summary: Try to auto-generate CacheIR boilerplate → Auto-generate CacheIR boilerplate
Blocks: 1632127
You need to log in before you can comment on or make changes to this bug.