Changeset 3767 in CLRX


Ignore:
Timestamp:
Feb 10, 2018, 12:48:33 PM (15 months ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmExpr?: Rewrite sectionDiffs support.

File:
1 edited

Legend:

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

    r3762 r3767  
    122122};
    123123
    124 // check whether sections is in resolvable section diffs
    125 static bool checkSectionDiffs(size_t n, const RelMultiply* relMultiplies,
    126                     const std::vector<AsmSection>& sections, bool withSectionDiffs,
    127                     bool sectDiffsPreppared, bool& tryLater)
    128 {
    129     if (n == 0)
    130         return true;
    131    
    132     if (!withSectionDiffs || sectDiffsPreppared)
    133         return false;
    134    
    135     for (size_t i = 0; i < n; i++)
    136         if (sections[relMultiplies[i].sectionId].relSpace == UINT_MAX)
    137             return false; // if found section not in anything relocation space
    138     tryLater = true;
    139     return true;
    140 }
    141 
    142 #define CHKSREL(rel) checkSectionDiffs(rel.size(), rel.data(), sections, \
    143                 withSectionDiffs, sectDiffsPreppared, tryLater)
    144 
    145124AsmTryStatus AsmExpression::tryEvaluate(Assembler& assembler, size_t opStart, size_t opEnd,
    146125                 uint64_t& outValue, cxuint& outSectionId, bool withSectionDiffs) const
     
    364343    else
    365344    {
    366         const bool sectDiffsPreppared = (assembler.formatHandler != nullptr &&
     345        const bool sectDiffsPrepared = (assembler.formatHandler != nullptr &&
    367346             assembler.formatHandler->isSectionDiffsResolvable());
    368347       
     
    407386                    uint64_t ovalue = args[argPos].relValue.value;
    408387                    cxuint osectId = args[argPos].relValue.sectionId;
    409                     if (sectDiffsPreppared && sections[osectId].relSpace!=UINT_MAX)
     388                    if (sectDiffsPrepared && sections[osectId].relSpace!=UINT_MAX)
    410389                    {
    411390                        // resolve section in relspace
     
    442421                        break;
    443422                    case AsmExprOp::LOGICAL_NOT:
    444                         if (!CHKSREL(relatives))
     423                        if (!relatives.empty())
    445424                            ASMX_FAILED_BY_ERROR(sourcePos,
    446425                                 "Logical negation is not allowed to relative values")
     
    488467                    case AsmExprOp::MULTIPLY:
    489468                        // we do not multiply with relatives in two operands
    490                         if (!CHKSREL(relatives) && !CHKSREL(relatives2))
     469                        if (!relatives.empty() && !relatives2.empty())
    491470                            ASMX_FAILED_BY_ERROR(sourcePos,
    492471                                 "Multiplication is not allowed for two relative values")
     
    513492                        break;
    514493                    case AsmExprOp::DIVISION:
    515                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     494                        if (!relatives.empty() || !relatives2.empty())
    516495                            ASMX_FAILED_BY_ERROR(sourcePos,
    517496                                 "Division is not allowed for any relative value")
     
    528507                        break;
    529508                    case AsmExprOp::SIGNED_DIVISION:
    530                         if (!CHKSREL(relatives)|| !CHKSREL(relatives2))
     509                        if (!relatives.empty()|| !relatives2.empty())
    531510                            ASMX_FAILED_BY_ERROR(sourcePos,
    532511                                 "Signed division is not allowed for any relative value")
     
    543522                        break;
    544523                    case AsmExprOp::MODULO:
    545                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     524                        if (!relatives.empty() || !relatives2.empty())
    546525                            ASMX_FAILED_BY_ERROR(sourcePos,
    547526                                 "Modulo is not allowed for any relative value")
     
    558537                        break;
    559538                    case AsmExprOp::SIGNED_MODULO:
    560                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     539                        if (!relatives.empty() || !relatives2.empty())
    561540                            ASMX_FAILED_BY_ERROR(sourcePos,
    562541                                 "Signed Modulo is not allowed for any relative value")
     
    573552                        break;
    574553                    case AsmExprOp::BIT_AND:
    575                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     554                        if (!relatives.empty() || !relatives2.empty())
    576555                            ASMX_FAILED_BY_ERROR(sourcePos,
    577556                                 "Binary AND is not allowed for any relative value")
     
    579558                        break;
    580559                    case AsmExprOp::BIT_OR:
    581                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     560                        if (!relatives.empty() || !relatives2.empty())
    582561                            ASMX_FAILED_BY_ERROR(sourcePos,
    583562                                 "Binary OR is not allowed for any relative value")
     
    585564                        break;
    586565                    case AsmExprOp::BIT_XOR:
    587                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     566                        if (!relatives.empty() || !relatives2.empty())
    588567                            ASMX_FAILED_BY_ERROR(sourcePos,
    589568                                 "Binary XOR is not allowed for any relative value")
     
    591570                        break;
    592571                    case AsmExprOp::BIT_ORNOT:
    593                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     572                        if (!relatives.empty() || !relatives2.empty())
    594573                            ASMX_FAILED_BY_ERROR(sourcePos,
    595574                                 "Binary ORNOT is not allowed for any relative value")
     
    597576                        break;
    598577                    case AsmExprOp::SHIFT_LEFT:
    599                         if (!CHKSREL(relatives))
     578                        if (!relatives.empty())
    600579                            ASMX_FAILED_BY_ERROR(sourcePos, "Shift left is not allowed "
    601580                                    "for any for relative second value")
     
    616595                        break;
    617596                    case AsmExprOp::SHIFT_RIGHT:
    618                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     597                        if (!relatives.empty() || !relatives2.empty())
    619598                            ASMX_FAILED_BY_ERROR(sourcePos,
    620599                                 "Shift right is not allowed for any relative value")
     
    630609                        break;
    631610                    case AsmExprOp::SIGNED_SHIFT_RIGHT:
    632                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     611                        if (!relatives.empty() || !relatives2.empty())
    633612                            ASMX_FAILED_BY_ERROR(sourcePos, "Signed shift right is not "
    634613                                    "allowed for any relative value")
     
    644623                        break;
    645624                    case AsmExprOp::LOGICAL_AND:
    646                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     625                        if (!relatives.empty() || !relatives2.empty())
    647626                            ASMX_FAILED_BY_ERROR(sourcePos,
    648627                                 "Logical AND is not allowed for any relative value")
     
    650629                        break;
    651630                    case AsmExprOp::LOGICAL_OR:
    652                         if (!CHKSREL(relatives) || !CHKSREL(relatives2))
     631                        if (!relatives.empty() || !relatives2.empty())
    653632                            ASMX_FAILED_BY_ERROR(sourcePos,
    654633                                 "Logical OR is not allowed for any relative value")
     
    666645                    case AsmExprOp::ABOVE_EQ:
    667646                    {
     647                        // TODO: include relspace before section diffs resolving
    668648                        size_t requals = 0;
    669649                        if (relatives2.size() != relatives.size())
     
    738718                const Array<RelMultiply> relatives3 = stack.top().relatives;
    739719                stack.pop();
    740                 if (!CHKSREL(relatives3))
     720                if (!relatives3.empty())
    741721                    ASMX_FAILED_BY_ERROR(sourcePos,
    742722                         "Choice is not allowed for first relative value")
     
    756736            relatives.assign(stack.top().relatives.begin(), stack.top().relatives.end());
    757737        }
     738       
    758739        if (relatives.empty())
    759740            sectionId = ASMSECT_ABS;
     
    761742            sectionId = relatives.front().sectionId;
    762743        else
    763             ASMX_FAILED_BY_ERROR(sourcePos,
    764                      "Only one relative=1 (section) can be result of expression")
    765        
    766         if (sectDiffsPreppared && sectionId != ASMSECT_ABS &&
     744        {
     745            bool moreThanOneRelSpace = false;
     746            cxuint relSpace = UINT_MAX;
     747            if (withSectionDiffs && !sectDiffsPrepared)
     748                // resolve whether is one relspace or not
     749                for (const RelMultiply r: relatives)
     750                {
     751                    if (sections[r.sectionId].relSpace != UINT_MAX)
     752                    {
     753                        if (relSpace != UINT_MAX &&
     754                            relSpace != sections[r.sectionId].relSpace)
     755                        {
     756                            moreThanOneRelSpace = true;
     757                            break;
     758                        }
     759                        relSpace = sections[r.sectionId].relSpace;
     760                    }
     761                    else // treat section without relspace as separate relspace
     762                    {
     763                        moreThanOneRelSpace = true;
     764                        break;
     765                    }
     766                }
     767            else
     768                moreThanOneRelSpace = true;
     769           
     770            if (moreThanOneRelSpace)
     771                ASMX_FAILED_BY_ERROR(sourcePos,
     772                        "Only one relative=1 (section) can be result of expression")
     773            else // not sure, should be evaluated after section diffs resolving
     774                tryLater = true;
     775        }
     776       
     777        if (sectDiffsPrepared && sectionId != ASMSECT_ABS &&
    767778            sections[sectionId].relSpace != UINT_MAX)
    768779        {   // find proper section
Note: See TracChangeset for help on using the changeset viewer.