Changeset 3630 in CLRX


Ignore:
Timestamp:
Jan 18, 2018, 4:19:56 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: Asm: Add preliminary code of AsmForInputFilter?. Fixed old stupid bug of error handling when makeSymbolSnapshot called.

Location:
CLRadeonExtender/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdasm/AsmDefs.h

    r3629 r3630  
    420420    /// for internal usage
    421421    size_t toTop(size_t opIndex) const;
     422   
     423    /// create an expression to evaluate from base expression
     424    AsmExpression* createExprToEvaluate(Assembler& assembler) const;
    422425   
    423426    /// make symbol snapshot (required to implement .eqv pseudo-op)   
  • CLRadeonExtender/trunk/CLRX/amdasm/Assembler.h

    r3616 r3630  
    412412    friend class AsmStreamInputFilter;
    413413    friend class AsmMacroInputFilter;
     414    friend class AsmForInputFilter;
    414415    friend class AsmExpression;
    415416    friend class AsmFormatHandler;
  • CLRadeonExtender/trunk/amdasm/AsmExpression.cpp

    r3576 r3630  
    10281028}
    10291029
     1030AsmExpression* AsmExpression::createExprToEvaluate(Assembler& assembler) const
     1031{
     1032    TempSymbolSnapshotMap symbolSnapshots;
     1033   
     1034    try
     1035    {
     1036    size_t argsNum = 0;
     1037    size_t msgPosNum = 0;
     1038    for (AsmExprOp op: ops)
     1039        if (AsmExpression::isArg(op))
     1040            argsNum++;
     1041    else if (operatorWithMessage & (1ULL<<int(op)))
     1042        msgPosNum++;
     1043    std::unique_ptr<AsmExpression> newExpr(new AsmExpression(
     1044            sourcePos, symOccursNum, relativeSymOccurs, ops.size(), ops.data(),
     1045            msgPosNum, messagePositions.get(), argsNum, args.get(), false));
     1046    argsNum = 0;
     1047    bool good = true;
     1048    // try to resolve symbols
     1049    for (AsmExprOp op: ops)
     1050        if (AsmExpression::isArg(op))
     1051        {
     1052            if (op == AsmExprOp::ARG_SYMBOL) // if
     1053            {
     1054                AsmExprArg& arg = newExpr->args[argsNum];
     1055                AsmSymbolEntry* symEntry = arg.symbol;
     1056                if (symEntry!=nullptr && symEntry->second.base)
     1057                    // create symbol snapshot if symbol is base
     1058                    // only if for regular expression (not base
     1059                    good &= newExpr->makeSymbolSnapshot(assembler, &symbolSnapshots,
     1060                                *symEntry, symEntry, &sourcePos);
     1061                if (symEntry==nullptr || !symEntry->second.hasValue)
     1062                {
     1063                    // no symbol not found
     1064                    std::string errorMsg("Expression have unresolved symbol '");
     1065                    errorMsg += symEntry->first.c_str();
     1066                    errorMsg += '\'';
     1067                    ASMX_NOTGOOD_BY_ERROR(sourcePos, errorMsg.c_str())
     1068                }
     1069                else
     1070                {
     1071                    if (symEntry->second.hasValue)
     1072                    {
     1073                        // resolve only if have symbol have value,
     1074                        // but do not that if expression will be base for snapshot
     1075                        if (!assembler.isAbsoluteSymbol(symEntry->second))
     1076                        {
     1077                            newExpr->relativeSymOccurs = true;
     1078                            arg.relValue.sectionId = symEntry->second.sectionId;
     1079                        }
     1080                        arg.relValue.value = symEntry->second.value;
     1081                        newExpr->symOccursNum--;
     1082                    }
     1083                }
     1084            }
     1085            argsNum++;
     1086        }
     1087   
     1088    // add expression into symbol occurrences in expressions
     1089    for (size_t i = 0, j = 0; j < argsNum; i++)
     1090        if (newExpr->ops[i] == AsmExprOp::ARG_SYMBOL)
     1091        {
     1092            newExpr->args[j].symbol->second.addOccurrenceInExpr(newExpr.get(), j, i);
     1093            j++;
     1094        }
     1095        else if (newExpr->ops[i]==AsmExprOp::ARG_VALUE)
     1096            j++;
     1097   
     1098    for (AsmSymbolEntry* symEntry: symbolSnapshots)
     1099    {
     1100        if (!symEntry->second.hasValue)
     1101            assembler.symbolSnapshots.insert(symEntry);
     1102        else
     1103        {
     1104            // delete symbol snapshoft if have new value
     1105            delete symEntry->second.expression;
     1106            symEntry->second.expression = nullptr;
     1107            delete symEntry;
     1108        }
     1109    }
     1110    symbolSnapshots.clear();
     1111    return newExpr.release();
     1112    }
     1113    catch(...)
     1114    {
     1115        // delete symbol snapshots if exception occurred
     1116        for (AsmSymbolEntry* symEntry: symbolSnapshots)
     1117        {
     1118            // remove from assembler symbolSnapshots
     1119            assembler.symbolSnapshots.erase(symEntry);
     1120            // remove this snapshot
     1121            delete symEntry->second.expression;
     1122            symEntry->second.expression = nullptr;
     1123            delete symEntry;
     1124        }
     1125        throw;
     1126    }
     1127}
     1128
    10301129AsmExpression* AsmExpression::parse(Assembler& assembler, const char*& linePtr,
    10311130            bool makeBase, bool dontResolveSymbolsLater)
     
    13001399                            // create symbol snapshot if symbol is base
    13011400                            // only if for regular expression (not base
    1302                             good = makeSymbolSnapshot(assembler, &symbolSnapshots,
     1401                            good &= makeSymbolSnapshot(assembler, &symbolSnapshots,
    13031402                                      *symEntry, symEntry, &(expr->sourcePos));
    13041403                        if (symEntry==nullptr ||
  • CLRadeonExtender/trunk/amdasm/AsmSource.cpp

    r3629 r3630  
    963963    colTranslations.clear();
    964964    const std::vector<LineTrans>& repeatColTrans = repeat->getColTranslations();
     965    const AsmFor* asmFor = static_cast<const AsmFor*>(repeat.get());
    965966    const LineTrans* colTransEnd = repeatColTrans.data()+ repeatColTrans.size();
    966967    const size_t contentSize = repeat->getContent().size();
     
    968969    {
    969970        repeatCount++;
    970         if (repeatCount == repeat->getRepeatsNum() || contentSize==0)
     971        uint64_t value = 0;
     972        cxuint sectionId = ASMSECT_ABS;
     973        {
     974            std::unique_ptr<AsmExpression> condEvExpr(asmFor->getCondExpr()->
     975                        createExprToEvaluate(assembler));
     976            if (!condEvExpr->evaluate(assembler, value, sectionId) ||
     977                        sectionId != ASMSECT_ABS)
     978                value = 0;
     979        }
     980        {
     981            std::unique_ptr<AsmExpression> nextEvExpr(asmFor->getNextExpr()->
     982                        createExprToEvaluate(assembler));
     983            uint64_t nextValue = 0;
     984            cxuint nextSectionId = ASMSECT_ABS;
     985            if (nextEvExpr->evaluate(assembler, nextValue, nextSectionId) &&
     986                        nextSectionId == ASMSECT_ABS)
     987                assembler.setSymbol(*(AsmSymbolEntry*)asmFor->getIterSymEntry(),
     988                                    nextValue, ASMSECT_ABS);
     989            else
     990                value = 0;
     991        }
     992       
     993        if (value==0 || contentSize==0)
    971994        {
    972995            lineSize = 0;
    973996            return nullptr;
    974997        }
     998       
    975999        sourceTransIndex = 0;
    9761000        curColTrans = repeat->getColTranslations().data();
Note: See TracChangeset for help on using the changeset viewer.