Changeset 3635 in CLRX


Ignore:
Timestamp:
Jan 19, 2018, 7:42:58 AM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: Asm: Print error about non-absolute value from '.for'/'.while' conditional expression. Set up sectionId for iterSymbol.
Add new testcases for testing '.for' pseudo-op.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/AsmSource.cpp

    r3632 r3635  
    988988                        nextSectionId == ASMSECT_ABS)
    989989                assembler.setSymbol(*(AsmSymbolEntry*)asmFor->getIterSymEntry(),
    990                                     nextValue, ASMSECT_ABS);
     990                                    nextValue, nextSectionId);
    991991            else
    992992                good = false;
     
    996996            std::unique_ptr<AsmExpression> condEvExpr(asmFor->getCondExpr()->
    997997                        createExprToEvaluate(assembler));
    998             if (condEvExpr==nullptr || !condEvExpr->evaluate(assembler, value, sectionId) ||
    999                         sectionId != ASMSECT_ABS)
     998            if (condEvExpr==nullptr || !condEvExpr->evaluate(assembler, value, sectionId))
    1000999                value = 0;
     1000            else if (sectionId != ASMSECT_ABS)
     1001            {
     1002                assembler.printError(asmFor->getCondExpr()->getSourcePos(),
     1003                        "Value of conditional expression is not absolute");
     1004                value = 0;
     1005            }
    10011006        }
    10021007       
  • CLRadeonExtender/trunk/tests/amdasm/AsmBasicsCases2.cpp

    r3632 r3635  
    20772077        }, true, "", ""
    20782078    },
     2079    /* 76 - '.for' repetition (error due to division by zero) */
     2080    {
     2081        R"ffDXD(
     2082            .for  x = 1  ,  x<  16,  x+x+(x/0)
     2083                .int x
     2084            .endr
     2085)ffDXD",
     2086        BinaryFormat::AMD, GPUDeviceType::CAPE_VERDE, false, { },
     2087        { { nullptr, ASMKERN_GLOBAL, AsmSectionType::DATA,
     2088            {
     2089                0x01, 0x00, 0x00, 0x00
     2090            } } },
     2091        {
     2092            { ".", 4U, 0, 0U, true, false, false, 0, 0 },
     2093            { "x", 1U, ASMSECT_ABS, 0U, true, false, false, 0, 0 }
     2094        }, false, "test.s:2:44: Error: Division by zero\n", ""
     2095    },
     2096    /* 77 - '.for' repetition (error due to division by zero) */
     2097    {
     2098        R"ffDXD(
     2099            .for  x = 1  ,  x<  16+(x/0),  x+x
     2100                .int x
     2101            .endr
     2102)ffDXD",
     2103        BinaryFormat::AMD, GPUDeviceType::CAPE_VERDE, false, { },
     2104        { { nullptr, ASMKERN_GLOBAL, AsmSectionType::DATA,
     2105            {
     2106                0x01, 0x00, 0x00, 0x00
     2107            } } },
     2108        {
     2109            { ".", 4U, 0, 0U, true, false, false, 0, 0 },
     2110            { "x", 2U, ASMSECT_ABS, 0U, true, false, false, 0, 0 }
     2111        }, false, "test.s:2:38: Error: Division by zero\n", ""
     2112    },
    20792113    { nullptr }
    20802114};
Note: See TracChangeset for help on using the changeset viewer.