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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.