Cleanup marking logic for non-moving objects

The marking logic for non-moving and large objects currently grays the
read barrier state and sets the mark bitmap together. This causes the
following complexities:
1) Setting the mark bitmap has to be done atomically as application
threads also set the mark bitmap.
2) It requires using a separate false gray stack to handle cases where
due to concurrent execution one thread succeeds in graying the object
even after the object has been already marked.

This can be simplified if non-moving/large objects are treated just like
the unevac-space objects are. Marking the object involves testing
whether the object is already marked in the bitmap or not. If not, then
graying the read barrier state and pushing to the mark stack.
Eventually, GC thread sets the mark bit non-atomically while processing
the reference.

Bug: 119273672
Bug: 112720851
Bug: 119629540
Test: art/test/testrunner/testrunner.py --64
Change-Id: I7050d545d59d5d8b1c90813a982e6f464b15d5e3
3 files changed