Changeset 4983 in CLRX


Ignore:
Timestamp:
Sep 19, 2019, 7:13:04 PM (4 weeks ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCmGen: Set up kernel code offset in kernel descriptor. Remove obsolete stuff from AsmROCmFormat.

Location:
CLRadeonExtender/trunk
Files:
3 edited

Legend:

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

    r4979 r4983  
    478478    void* rocmGotGen;
    479479    void* rocmRelaDynGen;
     480    void* rocmLLVMGDataGen;
    480481    Array<CString> kdescSymNames;
    481482   
  • CLRadeonExtender/trunk/amdasm/AsmROCmFormat.cpp

    r4981 r4983  
    23942394        amdGpuArchValues.stepping = output.archStepping;
    23952395   
    2396     size_t kdescBaseOffset = 0;
    2397     if (output.llvm10BinFormat)
    2398     {
    2399         AsmSection& asmDSection = assembler.sections[dataSection];
    2400         kdescBaseOffset = ((asmDSection.content.size() + 4095)&~0xfff);
    2401     }
    24022396    // prepare kernels configuration
    24032397    for (size_t i = 0; i < kernelStates.size(); i++)
     
    26502644            {
    26512645                AsmROCmKernelConfig& config = *kernel.config.get();
    2652                 if (config.kernelCodeEntryOffset == BINGEN64_DEFAULT)
    2653                     // calculate kernel entry offset (if default)
    2654                     config.kernelCodeEntryOffset = kdescBaseOffset + kinput.offset -
    2655                                 ki*sizeof(ROCmKernelDescriptor);
    2656                
    26572646                // put kernel descriptor to global data
    26582647                ROCmKernelDescriptor kdesc{};
  • CLRadeonExtender/trunk/amdbin/ROCmBinaries.cpp

    r4982 r4983  
    452452};
    453453
     454class CLRX_INTERNAL ROCmLLVM10GlobalDataGen: public ElfRegionContent
     455{
     456private:
     457    size_t gdataSize;
     458    const cxbyte* gdata;
     459    ElfBinaryGen64& gen;
     460    cxuint gdataIndex;
     461    std::vector<size_t> kernelOffsets;
     462public:
     463    ROCmLLVM10GlobalDataGen(size_t gsize, const cxbyte* _gdata, ElfBinaryGen64& _gen,
     464            cxuint _gdataIndex, std::vector<size_t>&& _kernelOffsets) :
     465        gdataSize(gsize), gdata(_gdata), gen(_gen), gdataIndex(_gdataIndex)
     466    {
     467        kernelOffsets = std::move(_kernelOffsets);
     468    }
     469   
     470    void operator()(FastOutputBuffer& fob) const
     471    {
     472        size_t p = 0;
     473        size_t f = 16;
     474        size_t kdescOffset = 0;
     475        size_t gdataOffset = gen.getRegionOffset(gdataIndex);
     476        const size_t codeOffset = gen.getRegionOffset(gdataIndex+1);
     477        for (size_t ko: kernelOffsets)
     478        {
     479            fob.writeArray(std::min(f, gdataSize)-p, gdata+p);
     480            uint64_t v = 0;
     481            SULEV(v, (codeOffset + ko) - (gdataOffset + kdescOffset));
     482            fob.writeObject(v);
     483            p = f + 8;
     484            f += sizeof(ROCmKernelDescriptor);
     485            kdescOffset += sizeof(ROCmKernelDescriptor);
     486        }
     487        fob.writeArray(gdataSize-p, gdata+p);
     488    }
     489};
     490
    454491/*
    455492 * ROCm Binary Generator
     
    497534        size_t globalDataSize, const cxbyte* globalData,
    498535        std::vector<ROCmSymbolInput>&& symbols) :
    499         rocmGotGen(nullptr), rocmRelaDynGen(nullptr)
     536        rocmGotGen(nullptr), rocmRelaDynGen(nullptr), rocmLLVMGDataGen(nullptr)
    500537{
    501538    std::unique_ptr<ROCmInput> _input(new ROCmInput{});
     
    531568    if (rocmRelaDynGen!=nullptr)
    532569        delete (ROCmRelaDynGen*)rocmRelaDynGen;
     570    if (rocmLLVMGDataGen!=nullptr)
     571        delete (ROCmLLVM10GlobalDataGen*)rocmLLVMGDataGen;
    533572}
    534573
     
    745784    if (input->llvm10BinFormat)
    746785        if (input->globalData != nullptr)
    747             elfBinGen64->addRegion(ElfRegion64(input->globalDataSize, input->globalData, 64,
     786        {
     787            std::vector<size_t> koffsets;
     788            for (const ROCmSymbolInput& sym: input->symbols)
     789            {
     790                if (sym.type == ROCmRegionType::KERNEL)
     791                    koffsets.push_back(sym.offset);
     792            }
     793            ROCmLLVM10GlobalDataGen* sgen = new ROCmLLVM10GlobalDataGen(input->globalDataSize,
     794                        input->globalData, *elfBinGen64.get(),
     795                        mainBuiltinSectTable[ELFSECTID_RODATA-ELFSECTID_START],
     796                        std::move(koffsets));
     797            rocmLLVMGDataGen = (void*)sgen;
     798            elfBinGen64->addRegion(ElfRegion64(input->globalDataSize, sgen, 4,
    748799                    ".rodata", SHT_PROGBITS, SHF_ALLOC, 0, 0, Elf64Types::nobase));
     800        }
    749801    if (!input->gotSymbols.empty())
    750802    {
Note: See TracChangeset for help on using the changeset viewer.