tinycc-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Tinycc-devel] tinycc fails to parse mathcalls.h on armel


From: Thomas Preud'homme
Subject: Re: [Tinycc-devel] tinycc fails to parse mathcalls.h on armel
Date: Wed, 11 Aug 2010 18:32:29 +0200
User-agent: KMail/1.13.5 (Linux/2.6.32-5-amd64; KDE/4.4.5; x86_64; ; )

Le mercredi 11 août 2010 16:52:25, Thomas Preud'homme a écrit :
> Hi all,
> 
[SNIP]

Ok, I might have found. mathcalls.h is provided on Debian by libc6-dev. I made 
a diff between the version used in the last build and the current version and 
found there has been some changes around the last inclusion of 
bits/mathcalls.h (the one which declares each function with long double 
operand). I looked at the code in parse_btype function in tccgen.c

Here is the relevant code:

    t = 0;
    while(1) {
        switch(tok) {

 (some "case")

        case TOK_LONG:
            next();
            if ((t & VT_BTYPE) == VT_DOUBLE) {
                t = (t & ~VT_BTYPE) | VT_LDOUBLE;
            } else if ((t & VT_BTYPE) == VT_LONG) {
                t = (t & ~VT_BTYPE) | VT_LLONG;
            } else {
                u = VT_LONG;
                goto basic_type1;
            }
            break;

The test in TOK_LONG seems useless as t can't be different from 0 although I 
missed some hidden define which touch the variable 't'

Thus, program branch to basic_type1:

        basic_type1:
            if ((t & VT_BTYPE) != 0)
                error("too many basic types");
            t |= u;
            typespec_found = 1;
            break;

t is zero so the test is ok, the type t become u (VT_LONG) and the type is 
supposed to be found. All this happen when parsing the acos function (first 
function in mathcalls.h). This function first call parse_btype, then a few 
lines later it calls type_decl which parses "double" in that case. In 
type_decl, the token is tested and as it is not an identifier, it calls 
expect("identifiers"). The relevant code in type_decl is:

        /* type identifier */
        if (tok >= TOK_IDENT && (td & TYPE_DIRECT)) {
            *v = tok;
            next();
        } else {
            if (!(td & TYPE_ABSTRACT))
                expect("identifier");
            *v = 0;
        }

So to conclude, it seems a bug exist in the way parse_btype look for long long 
and long double. If not, please correct me quickly as I'll fix this this WE or 
earlier.

Best regards,

Thomas

Attachment: signature.asc
Description: This is a digitally signed message part.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]