Ignore:
Timestamp:
Aug 22, 2019, 5:50:57 PM (8 months ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCm: Add parsing printf infos in MsgPack? metadata. Fixing next testcase in ROCmMsgPack.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdbin/ROCmMetadata.cpp

    r4922 r4923  
    618618};
    619619
     620static void parsePrintfInfoString(const char* ptr2, const char* end2, size_t oldLineNo,
     621                size_t lineNo, ROCmPrintfInfo& printfInfo,
     622                std::unordered_set<cxuint>& printfIds)
     623{
     624    skipSpacesToLineEnd(ptr2, end2);
     625    try
     626    { printfInfo.id = cstrtovCStyle<uint32_t>(ptr2, end2, ptr2); }
     627    catch(const ParseException& ex)
     628    { throw ParseException(oldLineNo, ex.what()); }
     629   
     630    // check printf id uniqueness
     631    if (!printfIds.insert(printfInfo.id).second)
     632        throw ParseException(oldLineNo, "Duplicate of printf id");
     633   
     634    skipSpacesToLineEnd(ptr2, end2);
     635    if (ptr2==end2 || *ptr2!=':')
     636        throw ParseException(oldLineNo, "No colon after printf callId");
     637    ptr2++;
     638    skipSpacesToLineEnd(ptr2, end2);
     639    uint32_t argsNum = cstrtovCStyle<uint32_t>(ptr2, end2, ptr2);
     640    skipSpacesToLineEnd(ptr2, end2);
     641    if (ptr2==end2 || *ptr2!=':')
     642        throw ParseException(oldLineNo, "No colon after printf argsNum");
     643    ptr2++;
     644   
     645    printfInfo.argSizes.resize(argsNum);
     646   
     647    // parse arg sizes
     648    for (size_t i = 0; i < argsNum; i++)
     649    {
     650        skipSpacesToLineEnd(ptr2, end2);
     651        printfInfo.argSizes[i] = cstrtovCStyle<uint32_t>(ptr2, end2, ptr2);
     652        skipSpacesToLineEnd(ptr2, end2);
     653        if (ptr2==end2 || *ptr2!=':')
     654            throw ParseException(lineNo, "No colon after printf argsNum");
     655        ptr2++;
     656    }
     657    // format
     658    printfInfo.format.assign(ptr2, end2);
     659   
     660}
     661
    620662// printf info string consumer
    621663class CLRX_INTERNAL YAMLPrintfVectorConsumer: public YAMLElemConsumer
     
    641683        const char* ptr2 = str.c_str();
    642684        const char* end2 = str.c_str() + str.size();
    643         skipSpacesToLineEnd(ptr2, end2);
    644         try
    645         { printfInfo.id = cstrtovCStyle<uint32_t>(ptr2, end2, ptr2); }
    646         catch(const ParseException& ex)
    647         { throw ParseException(oldLineNo, ex.what()); }
    648        
    649         // check printf id uniqueness
    650         if (!printfIds.insert(printfInfo.id).second)
    651             throw ParseException(oldLineNo, "Duplicate of printf id");
    652        
    653         skipSpacesToLineEnd(ptr2, end2);
    654         if (ptr2==end2 || *ptr2!=':')
    655             throw ParseException(oldLineNo, "No colon after printf callId");
    656         ptr2++;
    657         skipSpacesToLineEnd(ptr2, end2);
    658         uint32_t argsNum = cstrtovCStyle<uint32_t>(ptr2, end2, ptr2);
    659         skipSpacesToLineEnd(ptr2, end2);
    660         if (ptr2==end2 || *ptr2!=':')
    661             throw ParseException(oldLineNo, "No colon after printf argsNum");
    662         ptr2++;
    663        
    664         printfInfo.argSizes.resize(argsNum);
    665        
    666         // parse arg sizes
    667         for (size_t i = 0; i < argsNum; i++)
    668         {
    669             skipSpacesToLineEnd(ptr2, end2);
    670             printfInfo.argSizes[i] = cstrtovCStyle<uint32_t>(ptr2, end2, ptr2);
    671             skipSpacesToLineEnd(ptr2, end2);
    672             if (ptr2==end2 || *ptr2!=':')
    673                 throw ParseException(lineNo, "No colon after printf argsNum");
    674             ptr2++;
    675         }
    676         // format
    677         printfInfo.format.assign(ptr2, end2);
     685        parsePrintfInfoString(ptr2, end2, oldLineNo, lineNo, printfInfo, printfIds);
    678686       
    679687        printfInfos.push_back(printfInfo);
     
    22302238        else if (name == "amdhsa.printf")
    22312239        {
     2240            std::unordered_set<cxuint> printfIds;
    22322241            MsgPackArrayParser printfsParser = mainMap.parseValueArray();
    22332242            while (printfsParser.haveElements())
    22342243            {
    2235                 printfsParser.parseString();
     2244                ROCmPrintfInfo printfInfo{};
     2245                std::string pistr = printfsParser.parseString();
     2246                parsePrintfInfoString(pistr.c_str(), pistr.c_str() + pistr.size(),
     2247                                0, 0, printfInfo, printfIds);
     2248                metadataInfo.printfInfos.push_back(printfInfo);
    22362249            }
    22372250        }
Note: See TracChangeset for help on using the changeset viewer.