Changeset 4926 in CLRX


Ignore:
Timestamp:
Aug 24, 2019, 9:36:03 AM (4 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCm: Add stuff to handle LLVM10 ROCm binary format (kernel descriptors). Copy Amd3KernelDescriptor to ROCmBinary.h as ROCmKernelDescriptor.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/CLRX/amdbin/ROCmBinaries.h

    r4896 r4926  
    4747    ROCMBIN_CREATE_METADATAINFO = 0x20,     ///< create metadata info object
    4848    ROCMBIN_CREATE_KERNELINFOMAP = 0x40,    ///< create kernel metadata info map
     49    ROCMBIN_CREATE_KERNELDESCMAP = 0x80,    ///< create kernel descriptor map
    4950    ROCMBIN_CREATE_ALL = ELF_CREATE_ALL | 0xfff0 ///< all ROCm binaries flags
    5051};
     
    202203};
    203204
     205struct ROCmKernelDescriptor
     206{
     207    uint32_t groupSegmentFixedSize;
     208    uint32_t privateSegmentFixedSize;
     209    uint64_t reserved0;
     210    uint64_t kernelCodeEntryOffset;
     211    uint64_t reserved1;
     212    cxbyte reserved2[12];
     213    uint32_t pgmRsrc3;
     214    uint32_t pgmRsrc1;
     215    uint32_t pgmRsrc2;
     216    uint16_t initialKernelExecState;
     217    cxbyte reserved3[6];
     218   
     219    void toLE()
     220    {
     221        SLEV(groupSegmentFixedSize, groupSegmentFixedSize);
     222        SLEV(privateSegmentFixedSize, privateSegmentFixedSize);
     223        SLEV(kernelCodeEntryOffset, kernelCodeEntryOffset);
     224        SLEV(pgmRsrc3, pgmRsrc3);
     225        SLEV(pgmRsrc1, pgmRsrc1);
     226        SLEV(pgmRsrc2, pgmRsrc2);
     227        SLEV(initialKernelExecState, initialKernelExecState);
     228    }
     229};
     230
    204231/// ROCm main binary for GPU for 64-bit mode
    205232/** This object doesn't copy binary code content.
     
    224251    std::unique_ptr<ROCmMetadata> metadataInfo;
    225252    RegionMap kernelInfosMap;
     253    Array<const ROCmKernelDescriptor*> kernelDescs;
    226254    Array<size_t> gotSymbols;
    227255    bool newBinFormat;
     256    bool llvm10BinFormat;
     257    bool metadataV3Format;
    228258public:
    229259    /// constructor
     
    305335    bool isNewBinaryFormat() const
    306336    { return newBinFormat; }
     337   
     338    /// return true is LLVM10 binary format
     339    bool isLLVM10BinaryFormat() const
     340    { return llvm10BinFormat; }
     341   
     342    /// return true is metadata V3 code object format
     343    bool isMetadataV3Format() const
     344    { return metadataV3Format; }
    307345   
    308346    /// get GOT symbol index (from elfbin dynsymbols)
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r4895 r4926  
    4949          regionsNum(0), codeSize(0), code(nullptr),
    5050          globalDataSize(0), globalData(nullptr), metadataSize(0), metadata(nullptr),
    51           newBinFormat(false)
     51          newBinFormat(false), llvm10BinFormat(false), metadataV3Format(false)
    5252{
    5353    cxuint textIndex = SHN_UNDEF;
     
    6666    }
    6767   
     68    if (getHeader().e_ident[EI_ABIVERSION] == 1)
     69        llvm10BinFormat = true; // likely llvm10 bin format
     70   
    6871    cxuint rodataIndex = SHN_UNDEF;
     72    const cxbyte* rodataContent = nullptr;
    6973    try
    7074    { rodataIndex = getSectionIndex(".rodata"); }
     
    7478    if (rodataIndex!=SHN_UNDEF)
    7579    {
    76         globalData = getSectionContent(rodataIndex);
     80        rodataContent = globalData = getSectionContent(rodataIndex);
    7781        const Elf64_Shdr& rodataShdr = getSectionHeader(rodataIndex);
    7882        globalDataSize = ULEV(rodataShdr.sh_size);
     
    99103   
    100104    // counts regions (symbol or kernel)
     105    std::vector<std::pair<CString, size_t> > tmpKernelDescs;
    101106    regionsNum = 0;
    102107    const size_t symbolsNum = getSymbolsNum();
     
    107112        const cxbyte symType = ELF64_ST_TYPE(sym.st_info);
    108113        const cxbyte bind = ELF64_ST_BIND(sym.st_info);
    109         if (ULEV(sym.st_shndx)==textIndex &&
     114        Elf64_Half shndx = ULEV(sym.st_shndx);
     115        if (shndx==textIndex &&
    110116            (symType==STT_GNU_IFUNC || (symType==STT_FUNC && !newBinFormat) ||
    111117                (bind==STB_GLOBAL && symType==STT_OBJECT)))
    112118            regionsNum++;
    113     }
     119        if (llvm10BinFormat && shndx==rodataIndex && symType==STT_OBJECT)
     120        {
     121            const char* symName = getSymbolName(i);
     122            size_t symNameLen = ::strlen(symName);
     123            // if symname have '.kd' at end
     124            if (symNameLen > 3 && symName[symNameLen-3]=='.' &&
     125                symName[symNameLen-2]=='k' && symName[symNameLen-1]=='d')
     126                tmpKernelDescs.push_back({ CString(symName, symName+symNameLen-3),
     127                            ULEV(sym.st_value) });
     128        }
     129    }
     130    if (llvm10BinFormat)
     131    {
     132        if (rodataContent==nullptr)
     133            throw BinException("No rodata section in ROCm LLVM10Bin format");
     134        mapSort(tmpKernelDescs.begin(), tmpKernelDescs.end());
     135        kernelDescs.resize(regionsNum);
     136    }
     137   
    114138    if (code==nullptr && regionsNum!=0)
    115139        throw BinException("No code if regions number is not zero");
     
    149173            if (type!=ROCmRegionType::DATA && value+0x100 > codeOffset+codeSize)
    150174                throw BinException("Kernel or code offset is too big!");
    151             regions[j++] = { getSymbolName(i), size, value, type };
     175            const char* symName = getSymbolName(i);
     176            regions[j++] = { symName, size, value, type };
     177            if (llvm10BinFormat)
     178            {
     179                auto it = binaryMapFind(tmpKernelDescs.begin(), tmpKernelDescs.end(),
     180                                        CString(symName));
     181                if (it != tmpKernelDescs.end())
     182                    kernelDescs[i] = reinterpret_cast<const ROCmKernelDescriptor*>(
     183                                rodataContent + it->second);
     184                else
     185                    kernelDescs[i] = nullptr;
     186            }
    152187        }
    153188    }
Note: See TracChangeset for help on using the changeset viewer.