Ignore:
Timestamp:
Feb 6, 2018, 3:54:23 PM (22 months ago)
Author:
matszpk
Message:

CLRadeonExtender: DisasmAmd?&DisasmROCm: Check arg types and other fields before printing.
ROCmMetadata: Check arg types and other fields before generating. Escape number in string fields.
AsmROCm: Add additional pseudo-ops (only names) to set metadata info.

File:
1 edited

Legend:

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

    r3725 r3726  
    15241524    bool toEscape = false;
    15251525    const char* s;
     1526    bool nonDigit = false;
    15261527    for (s = input.c_str(); *s!=0; s++)
    15271528    {
     
    15331534            break;
    15341535        }
     1536        nonDigit |= isDigit(c);
    15351537    }
    15361538    // if spaces in begin and end
    1537     if (isSpace(input[0]) || (!input.empty() && isSpace(s[-1])))
     1539    if (!nonDigit || isSpace(input[0]) || isDigit(input[0]) ||
     1540        (!input.empty() && isSpace(s[-1])))
    15381541        toEscape = true;
    15391542   
     
    15481551}
    15491552
    1550 void generateROCmMetadata(const ROCmMetadata& mdInfo, const ROCmKernelConfig** kconfigs,
    1551                     std::string& output)
     1553static void generateROCmMetadata(const ROCmMetadata& mdInfo,
     1554                    const ROCmKernelConfig** kconfigs, std::string& output)
    15521555{
    15531556    output.clear();
     
    16601663            output += numBuf;
    16611664            output += "\n        ValueKind:       ";
     1665           
     1666            if (argInfo.valueKind > ROCmValueKind::MAX_VALUE)
     1667                throw BinGenException("Unknown ValueKind");
    16621668            output += rocmValueKindNames[cxuint(argInfo.valueKind)];
     1669           
     1670            if (argInfo.valueType > ROCmValueType::MAX_VALUE)
     1671                throw BinGenException("Unknown ValueType");
    16631672            output += "\n        ValueType:       ";
    16641673            output += rocmValueTypeNames[cxuint(argInfo.valueType)];
     
    16751684                argInfo.valueKind == ROCmValueKind::GLOBAL_BUFFER)
    16761685            {
     1686                if (argInfo.addressSpace > ROCmAddressSpace::MAX_VALUE)
     1687                    throw BinGenException("Unknown AddressSpace");
    16771688                output += "        AddrSpaceQual:   ";
    16781689                output += rocmAddrSpaceTypesTbl[cxuint(argInfo.addressSpace)];
     
    16821693                argInfo.valueKind == ROCmValueKind::PIPE)
    16831694            {
     1695                if (argInfo.accessQual> ROCmAccessQual::MAX_VALUE)
     1696                    throw BinGenException("Unknown AccessQualifier");
    16841697                output += "        AccQual:         ";
    16851698                output += rocmAccessQualifierTbl[cxuint(argInfo.accessQual)];
     
    16901703                argInfo.valueKind == ROCmValueKind::PIPE)
    16911704            {
     1705                if (argInfo.actualAccessQual> ROCmAccessQual::MAX_VALUE)
     1706                    throw BinGenException("Unknown ActualAccessQualifier");
    16921707                output += "        ActualAccQual:   ";
    16931708                output += rocmAccessQualifierTbl[cxuint(argInfo.actualAccessQual)];
     
    19882003        std::unique_ptr<const ROCmKernelConfig*[]> kernelConfigPtrs(
    19892004                new const ROCmKernelConfig*[mdKernelsNum]);
     2005        // generate ROCm kernel config pointers
    19902006        for (size_t k = 0; k < mdKernelsNum; k++)
    19912007        {
    19922008            auto it = binaryMapFind(symbolIndices.begin(), symbolIndices.end(),
    19932009                        input->metadataInfo.kernels[k].name);
    1994             if (it == symbolIndices.end())
     2010            if (it == symbolIndices.end() ||
     2011                (input->symbols[it->second].type != ROCmRegionType::FKERNEL &&
     2012                 input->symbols[it->second].type != ROCmRegionType::KERNEL))
    19952013                throw BinGenException("Kernel in metadata doesn't exists in code");
    19962014            kernelConfigPtrs[k] = reinterpret_cast<const ROCmKernelConfig*>(
    19972015                        input->code + input->symbols[it->second].offset);
    19982016        }
    1999        
     2017        // just generate ROCm metadata from info
    20002018        generateROCmMetadata(input->metadataInfo, kernelConfigPtrs.get(), metadataStr);
    20012019        metadataSize = metadataStr.size();
Note: See TracChangeset for help on using the changeset viewer.