Checker: Support IF, ELIF, ELSE, FI

It is now possible to add conditional statements in tests in the
following form:

/// CHECK-IF:   condition1
///             CHECK: foobar01
/// CHECK-ELIF: condition2
///             CHECK: foobar02
/// CHECK-ELSE:
///             CHECK: foobar03
/// CHECK-FI:

- Conditions are Python statements evaluated with `eval`.
- They can contain references to previously defined variables
  (<<MyVar>>).
- Nested branching is supported.

Credits: the initial implementation of the patch was written by David
Brazdil (dbrazdil@google.com). It incuded support for IF, ELSE and FI.
Furthermore, this patch includes a test case
(2231-checker-heap-poisoning) mostly written by Roland Levillain
(rpl@google.com).
The CL adds support for ELIF, CHECK-NEXT and CHECK-DAG in branches,
tests and documentation.

Author:    Fabio Rinaldi
Committer: Artem Serov

Test: art/tools/checker/run_unit_tests.py
Test: test.py --target --optimizing with tweaks to env
      ART_HEAP_POISONING (set it to True or False) and
      ART_READ_BARRIER_TYPE (set it equal or not equal to 'TABLELOOKUP')
Test: test.py --host --optimizing with the same tweaks
Bug: 147876827
Change-Id: I73f87781b9e7862d5735c6160ac351610fc9bd92
10 files changed