[Mesa-dev] [PATCH] glsl: Fix glcpp to properly lex entire "preprocessing numbers"

Anuj Phogat anuj.phogat at gmail.com
Thu Jun 19 15:36:48 PDT 2014


On Thu, Jun 12, 2014 at 5:18 PM, Anuj Phogat <anuj.phogat at gmail.com> wrote:
> On Thu, Jun 12, 2014 at 3:13 PM, Carl Worth <cworth at cworth.org> wrote:
>>
>> The preprocessor defines a notions of a "preprocessing number" that
>> starts with either a digit or a decimal point, and continues with zero
>> or more of digits, decimal points, identifier characters, or the sign
>> symbols, ('-' and '+').
>>
>> Prior to this change, preprocessing numbers were lexed as some
>> combination of OTHER and IDENTIFIER tokens. This had the problem of
>> causing undesired macro expansion in some cases.
>>
>> We add tests to ensure that the undesired macro expansion does not
>> happen in cases such as:
>>
>>         #define e +1
>>         #define xyz -2
>>
>>         int n = 1e;
>>         int p = 1xyz;
>>
>> In either case these macro definitions have no effect after this
>> change, so that the numeric literals, (whether valid or not), will be
>> passed on as-is from the preprocessor to the compiler proper.
>>
>> This fixes at least the following Khronos GLES3 CTS test:
>>
>> preprocessor.basic.correct_phases_fragment
>> ---
>>  src/glsl/glcpp/glcpp-lex.l                                | 6 ++++++
>>  src/glsl/glcpp/tests/124-preprocessing-numbers.c          | 8 ++++++++
>>  src/glsl/glcpp/tests/124-preprocessing-numbers.c.expected | 9 +++++++++
>>  3 files changed, 23 insertions(+)
>>  create mode 100644 src/glsl/glcpp/tests/124-preprocessing-numbers.c
>>  create mode 100644 src/glsl/glcpp/tests/124-preprocessing-numbers.c.expected
>>
>> diff --git a/src/glsl/glcpp/glcpp-lex.l b/src/glsl/glcpp/glcpp-lex.l
>> index d5fb087..4dbaa9e 100644
>> --- a/src/glsl/glcpp/glcpp-lex.l
>> +++ b/src/glsl/glcpp/glcpp-lex.l
>> @@ -91,6 +91,7 @@ DIGITS                        [0-9][0-9]*
>>  DECIMAL_INTEGER                [1-9][0-9]*[uU]?
>>  OCTAL_INTEGER          0[0-7]*[uU]?
>>  HEXADECIMAL_INTEGER    0[xX][0-9a-fA-F]+[uU]?
>> +PP_NUMBER              [0-9.][-+._a-zA-Z0-9]*
It causes '2.0-MACRO' to incorrectly lexed as a preprocessing number.
Around 30 GLES3 CTS tests failed with this patch.

I think using below definition of preprocessing numbers should work fine:
PP_NUMBER                   \.?[0-9]([._a-zA-Z0-9]|[eEpP][+-])*

Used below link for definition of a preprocessing number:
https://gcc.gnu.org/onlinedocs/cpp/Tokenization.html

>>
>>  %%
>>
>> @@ -339,6 +340,11 @@ HEXADECIMAL_INTEGER        0[xX][0-9a-fA-F]+[uU]?
>>         return OTHER;
>>  }
>>
>> +{PP_NUMBER} {
>> +       yylval->str = ralloc_strdup (yyextra, yytext);
>> +       return OTHER;
>> +}
>> +
>>  {HSPACE} {
>>         if (yyextra->space_tokens) {
>>                 return SPACE;
>> diff --git a/src/glsl/glcpp/tests/124-preprocessing-numbers.c b/src/glsl/glcpp/tests/124-preprocessing-numbers.c
>> new file mode 100644
>> index 0000000..3743c69
>> --- /dev/null
>> +++ b/src/glsl/glcpp/tests/124-preprocessing-numbers.c
>> @@ -0,0 +1,8 @@
>> +#define e +1
>> +#define xyz -2
>> +
>> +/* The following are "preprocessing numbers" and should not trigger macro
>> + * expansion. */
>> +int n = 1e;
>> +int p = 1xyz;
>> +
>> diff --git a/src/glsl/glcpp/tests/124-preprocessing-numbers.c.expected b/src/glsl/glcpp/tests/124-preprocessing-numbers.c.expected
>> new file mode 100644
>> index 0000000..951581e
>> --- /dev/null
>> +++ b/src/glsl/glcpp/tests/124-preprocessing-numbers.c.expected
>> @@ -0,0 +1,9 @@
>> +
>> +
>> +
>> +
>> +
>> +int n = 1e;
>> +int p = 1xyz;
>> +
>> +
>> --
>> 2.0.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
> Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list