Ignore:
Timestamp:
Dec 1, 2016, 8:00:11 AM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCm: Recognize other kernel object (function) in binaries and disassemble them.

File:
1 edited

Legend:

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

    r2582 r2599  
    3333
    3434/* TODO: add support for various kernel code offset (now only 256 is supported) */
     35/* TODO: handle non-kernel functions (for Gallium also?) */
    3536
    3637ROCmBinary::ROCmBinary(size_t binaryCodeSize, cxbyte* binaryCode, Flags creationFlags)
     
    6061        const cxbyte bind = ELF64_ST_BIND(sym.st_info);
    6162        if (ULEV(sym.st_shndx)==textIndex &&
    62             (symType==STT_GNU_IFUNC || (bind==STB_GLOBAL && symType==STT_OBJECT)))
     63            (symType==STT_GNU_IFUNC || symType==STT_FUNC ||
     64                (bind==STB_GLOBAL && symType==STT_OBJECT)))
    6365            regionsNum++;
    6466    }
     
    8284        const cxbyte symType = ELF64_ST_TYPE(sym.st_info);
    8385        const cxbyte bind = ELF64_ST_BIND(sym.st_info);
    84         if (symType==STT_GNU_IFUNC || (bind==STB_GLOBAL && symType==STT_OBJECT))
     86        if (symType==STT_GNU_IFUNC || symType==STT_FUNC ||
     87                (bind==STB_GLOBAL && symType==STT_OBJECT))
    8588        {
    86             const bool isKernel = (symType==STT_GNU_IFUNC);
     89            ROCmRegionType type = ROCmRegionType::DATA;
     90            if (symType==STT_GNU_IFUNC)
     91                type = ROCmRegionType::KERNEL;
     92            else if (symType==STT_FUNC)
     93                type = ROCmRegionType::CODE;
    8794            symOffsets[j] = std::make_pair(value, j);
    88             if (isKernel && value+0x100 > codeOffset+codeSize)
    89                 throw Exception("Kernel offset is too big!");
    90             regions[j++] = { getSymbolName(i), size, value, isKernel };
     95            if (type!=ROCmRegionType::DATA && value+0x100 > codeOffset+codeSize)
     96                throw Exception("Kernel or code offset is too big!");
     97            regions[j++] = { getSymbolName(i), size, value, type };
    9198        }
    9299    }
     
    99106        size_t end = (i<regionsNum) ? symOffsets[i].first : codeOffset+codeSize;
    100107        ROCmRegion& region = regions[symOffsets[i-1].second];
    101         if (region.isKernel && symOffsets[i-1].first+0x100 > end)
     108        if (region.type==ROCmRegionType::KERNEL && symOffsets[i-1].first+0x100 > end)
    102109            throw Exception("Kernel size is too small!");
    103110       
     
    142149void ROCmInput::addEmptyKernel(const char* kernelName)
    143150{
    144     symbols.push_back({ kernelName, 0, 0, true });
     151    symbols.push_back({ kernelName, 0, 0, ROCmRegionType::KERNEL });
    145152}
    146153/*
     
    269276    {
    270277        ElfSymbol64 elfsym;
    271         if (symbol.isKernel)
    272             elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
    273                   ELF64_ST_INFO(STB_GLOBAL, STT_GNU_IFUNC), 0, true,
    274                   symbol.offset, symbol.size);
    275         else
    276             elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
    277                   ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), 0, true,
    278                   symbol.offset, symbol.size);
     278        switch (symbol.type)
     279        {
     280            case ROCmRegionType::KERNEL:
     281                elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
     282                      ELF64_ST_INFO(STB_GLOBAL, STT_GNU_IFUNC), 0, true,
     283                      symbol.offset, symbol.size);
     284                break;
     285            case ROCmRegionType::CODE:
     286                elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
     287                      ELF64_ST_INFO(STB_GLOBAL, STT_FUNC), 0, true,
     288                      symbol.offset, symbol.size);
     289                break;
     290            case ROCmRegionType::DATA:
     291                elfsym = ElfSymbol64(symbol.symbolName.c_str(), 4,
     292                      ELF64_ST_INFO(STB_GLOBAL, STT_OBJECT), 0, true,
     293                      symbol.offset, symbol.size);
     294                break;
     295            default:
     296                break;
     297        }
    279298        elfBinGen64.addSymbol(elfsym);
    280299        elfBinGen64.addDynSymbol(elfsym);
Note: See TracChangeset for help on using the changeset viewer.