Changeset 3271 in CLRX


Ignore:
Timestamp:
Aug 31, 2017, 7:14:23 PM (16 months ago)
Author:
matszpk
Message:

CLRadeonExtender: ROCmDisasm: Separate routines to disassemble code and config (for Gallium disassembler).

Location:
CLRadeonExtender/trunk/amdasm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/DisasmInternals.h

    r3270 r3271  
    5757       Flags flags);
    5858
     59extern CLRX_INTERNAL void dumpHSACOConfig(std::ostream& output, cxuint maxSgprsNum,
     60             GPUArchitecture arch, const ROCmKernelConfig& config);
     61
     62extern CLRX_INTERNAL void disassembleHSACOCode(std::ostream& output,
     63            const std::vector<ROCmDisasmRegionInput>& regions,
     64            size_t codeSize, const cxbyte* code, ISADisassembler* isaDisassembler,
     65            Flags flags);
     66
    5967extern CLRX_INTERNAL void disassembleGallium(std::ostream& output,
    6068       const GalliumDisasmInput* galliumInput, ISADisassembler* isaDisassembler,
  • CLRadeonExtender/trunk/amdasm/DisasmROCm.cpp

    r3270 r3271  
    5757}
    5858
    59 static void dumpKernelConfig(std::ostream& output, cxuint maxSgprsNum,
     59void CLRX::dumpHSACOConfig(std::ostream& output, cxuint maxSgprsNum,
    6060             GPUArchitecture arch, const ROCmKernelConfig& config)
    6161{
    62     output.write("    .config\n", 12);
    6362    // convert to native-endian
    6463    uint32_t amdCodeVersionMajor = ULEV(config.amdCodeVersionMajor);
     
    320319}
    321320
    322 void CLRX::disassembleROCm(std::ostream& output, const ROCmDisasmInput* rocmInput,
    323            ISADisassembler* isaDisassembler, Flags flags)
     321static void dumpKernelConfig(std::ostream& output, cxuint maxSgprsNum,
     322             GPUArchitecture arch, const ROCmKernelConfig& config)
     323{
     324    output.write("    .config\n", 12);
     325    dumpHSACOConfig(output, maxSgprsNum, arch, config);
     326}
     327
     328void CLRX::disassembleHSACOCode(std::ostream& output,
     329            const std::vector<ROCmDisasmRegionInput>& regions,
     330            size_t codeSize, const cxbyte* code, ISADisassembler* isaDisassembler,
     331            Flags flags)
    324332{
    325333    const bool doDumpData = ((flags & DISASM_DUMPDATA) != 0);
    326334    const bool doMetadata = ((flags & (DISASM_METADATA|DISASM_CONFIG)) != 0);
    327335    const bool doDumpCode = ((flags & DISASM_DUMPCODE) != 0);
     336    const bool doDumpConfig = ((flags & DISASM_CONFIG) != 0);
     337   
     338    const size_t regionsNum = regions.size();
     339    typedef std::pair<size_t, size_t> SortEntry;
     340    std::unique_ptr<SortEntry[]> sorted(new SortEntry[regionsNum]);
     341    for (size_t i = 0; i < regionsNum; i++)
     342        sorted[i] = std::make_pair(regions[i].offset, i);
     343    mapSort(sorted.get(), sorted.get() + regionsNum);
     344   
     345    output.write(".text\n", 6);
     346    // clear labels
     347    isaDisassembler->clearNumberedLabels();
     348   
     349    /// analyze code with collecting labels
     350    for (size_t i = 0; i < regionsNum; i++)
     351    {
     352        const ROCmDisasmRegionInput& region = regions[sorted[i].second];
     353        if (region.type==ROCmRegionType::KERNEL && doDumpCode)
     354        {   // kernel code
     355            isaDisassembler->setInput(region.size-256, code + region.offset+256,
     356                                region.offset+256);
     357            isaDisassembler->analyzeBeforeDisassemble();
     358        }
     359        else if (region.type==ROCmRegionType::FKERNEL && doDumpCode)
     360        {   // function code
     361            isaDisassembler->setInput(region.size, code + region.offset,
     362                                region.offset);
     363            isaDisassembler->analyzeBeforeDisassemble();
     364        }
     365        isaDisassembler->addNamedLabel(region.offset, region.regionName);
     366    }
     367    isaDisassembler->prepareLabelsAndRelocations();
     368   
     369    ISADisassembler::LabelIter curLabel;
     370    ISADisassembler::NamedLabelIter curNamedLabel;
     371    const auto& labels = isaDisassembler->getLabels();
     372    const auto& namedLabels = isaDisassembler->getNamedLabels();
     373    // real disassemble
     374    size_t prevRegionPos = 0;
     375    for (size_t i = 0; i < regionsNum; i++)
     376    {
     377        const ROCmDisasmRegionInput& region = regions[sorted[i].second];
     378        // set labelIters to previous position
     379        isaDisassembler->setInput(prevRegionPos, code + region.offset,
     380                                region.offset, prevRegionPos);
     381        curLabel = std::lower_bound(labels.begin(), labels.end(), prevRegionPos);
     382        curNamedLabel = std::lower_bound(namedLabels.begin(), namedLabels.end(),
     383            std::make_pair(prevRegionPos, CString()),
     384                [](const std::pair<size_t,CString>& a,
     385                                const std::pair<size_t, CString>& b)
     386                { return a.first < b.first; });
     387        isaDisassembler->writeLabelsToPosition(0, curLabel, curNamedLabel);
     388        isaDisassembler->flushOutput();
     389       
     390        size_t dataSize = codeSize - region.offset;
     391        if (i+1<regionsNum)
     392        {
     393            const ROCmDisasmRegionInput& newRegion = regions[sorted[i+1].second];
     394            dataSize = newRegion.offset - region.offset;
     395        }
     396        if (region.type!=ROCmRegionType::DATA)
     397        {
     398            if (doMetadata)
     399            {
     400                if (!doDumpConfig)
     401                    printDisasmData(0x100, code + region.offset, output, true);
     402                else    // skip, config was dumped in kernel configuration
     403                    output.write(".skip 256\n", 10);
     404            }
     405           
     406            if (doDumpCode)
     407            {
     408                isaDisassembler->setInput(dataSize-256, code + region.offset+256,
     409                                region.offset+256, region.offset+1);
     410                isaDisassembler->setDontPrintLabels(i+1<regionsNum);
     411                isaDisassembler->disassemble();
     412            }
     413            prevRegionPos = region.offset + dataSize + 1;
     414        }
     415        else if (doDumpData)
     416        {
     417            output.write(".global ", 8);
     418            output.write(region.regionName.c_str(), region.regionName.size());
     419            output.write("\n", 1);
     420            printDisasmData(dataSize, code + region.offset, output, true);
     421            prevRegionPos = region.offset+1;
     422        }
     423    }
     424   
     425    if (regionsNum!=0 && regions[sorted[regionsNum-1].second].type==ROCmRegionType::DATA)
     426    {
     427        const ROCmDisasmRegionInput& region = regions[sorted[regionsNum-1].second];
     428        // set labelIters to previous position
     429        isaDisassembler->setInput(prevRegionPos, code + region.offset+region.size,
     430                                region.offset+region.size, prevRegionPos);
     431        curLabel = std::lower_bound(labels.begin(), labels.end(), prevRegionPos);
     432        curNamedLabel = std::lower_bound(namedLabels.begin(), namedLabels.end(),
     433            std::make_pair(prevRegionPos, CString()),
     434                [](const std::pair<size_t,CString>& a,
     435                                const std::pair<size_t, CString>& b)
     436                { return a.first < b.first; });
     437        isaDisassembler->writeLabelsToPosition(0, curLabel, curNamedLabel);
     438        isaDisassembler->flushOutput();
     439        // if last region is not kernel, then print labels after last region
     440        isaDisassembler->writeLabelsToEnd(region.size, curLabel, curNamedLabel);
     441        isaDisassembler->flushOutput();
     442    }
     443}
     444
     445void CLRX::disassembleROCm(std::ostream& output, const ROCmDisasmInput* rocmInput,
     446           ISADisassembler* isaDisassembler, Flags flags)
     447{
     448    const bool doMetadata = ((flags & (DISASM_METADATA|DISASM_CONFIG)) != 0);
    328449    const bool doDumpConfig = ((flags & DISASM_CONFIG) != 0);
    329450   
     
    353474        }
    354475   
    355     const size_t regionsNum = rocmInput->regions.size();
    356     typedef std::pair<size_t, size_t> SortEntry;
    357     std::unique_ptr<SortEntry[]> sorted(new SortEntry[regionsNum]);
    358     for (size_t i = 0; i < regionsNum; i++)
    359         sorted[i] = std::make_pair(rocmInput->regions[i].offset, i);
    360     mapSort(sorted.get(), sorted.get() + regionsNum);
    361    
    362476    if (rocmInput->code != nullptr && rocmInput->codeSize != 0)
    363     {
    364         const cxbyte* code = rocmInput->code;
    365         output.write(".text\n", 6);
    366         // clear labels
    367         isaDisassembler->clearNumberedLabels();
    368        
    369         /// analyze code with collecting labels
    370         for (size_t i = 0; i < regionsNum; i++)
    371         {
    372             const ROCmDisasmRegionInput& region = rocmInput->regions[sorted[i].second];
    373             if (region.type==ROCmRegionType::KERNEL && doDumpCode)
    374             {   // kernel code
    375                 isaDisassembler->setInput(region.size-256, code + region.offset+256,
    376                                     region.offset+256);
    377                 isaDisassembler->analyzeBeforeDisassemble();
    378             }
    379             else if (region.type==ROCmRegionType::FKERNEL && doDumpCode)
    380             {   // function code
    381                 isaDisassembler->setInput(region.size, code + region.offset,
    382                                     region.offset);
    383                 isaDisassembler->analyzeBeforeDisassemble();
    384             }
    385             isaDisassembler->addNamedLabel(region.offset, region.regionName);
    386         }
    387         isaDisassembler->prepareLabelsAndRelocations();
    388        
    389         ISADisassembler::LabelIter curLabel;
    390         ISADisassembler::NamedLabelIter curNamedLabel;
    391         const auto& labels = isaDisassembler->getLabels();
    392         const auto& namedLabels = isaDisassembler->getNamedLabels();
    393         // real disassemble
    394         size_t prevRegionPos = 0;
    395         for (size_t i = 0; i < regionsNum; i++)
    396         {
    397             const ROCmDisasmRegionInput& region = rocmInput->regions[sorted[i].second];
    398             // set labelIters to previous position
    399             isaDisassembler->setInput(prevRegionPos, code + region.offset,
    400                                     region.offset, prevRegionPos);
    401             curLabel = std::lower_bound(labels.begin(), labels.end(), prevRegionPos);
    402             curNamedLabel = std::lower_bound(namedLabels.begin(), namedLabels.end(),
    403                 std::make_pair(prevRegionPos, CString()),
    404                   [](const std::pair<size_t,CString>& a,
    405                                  const std::pair<size_t, CString>& b)
    406                   { return a.first < b.first; });
    407             isaDisassembler->writeLabelsToPosition(0, curLabel, curNamedLabel);
    408             isaDisassembler->flushOutput();
    409            
    410             size_t dataSize = rocmInput->codeSize - region.offset;
    411             if (i+1<regionsNum)
    412             {
    413                 const ROCmDisasmRegionInput& newRegion =
    414                         rocmInput->regions[sorted[i+1].second];
    415                 dataSize = newRegion.offset - region.offset;
    416             }
    417             if (region.type!=ROCmRegionType::DATA)
    418             {
    419                 if (doMetadata)
    420                 {
    421                     if (!doDumpConfig)
    422                         printDisasmData(0x100, code + region.offset, output, true);
    423                     else    // skip, config was dumped in kernel configuration
    424                         output.write(".skip 256\n", 10);
    425                 }
    426                
    427                 if (doDumpCode)
    428                 {
    429                     isaDisassembler->setInput(dataSize-256, code + region.offset+256,
    430                                     region.offset+256, region.offset+1);
    431                     isaDisassembler->setDontPrintLabels(i+1<regionsNum);
    432                     isaDisassembler->disassemble();
    433                 }
    434                 prevRegionPos = region.offset + dataSize + 1;
    435             }
    436             else if (doDumpData)
    437             {
    438                 output.write(".global ", 8);
    439                 output.write(region.regionName.c_str(), region.regionName.size());
    440                 output.write("\n", 1);
    441                 printDisasmData(dataSize, code + region.offset, output, true);
    442                 prevRegionPos = region.offset+1;
    443             }
    444         }
    445        
    446         if (regionsNum!=0 &&
    447             rocmInput->regions[sorted[regionsNum-1].second].type==ROCmRegionType::DATA)
    448         {
    449             const ROCmDisasmRegionInput& region =
    450                     rocmInput->regions[sorted[regionsNum-1].second];
    451             // set labelIters to previous position
    452             isaDisassembler->setInput(prevRegionPos, code + region.offset+region.size,
    453                                     region.offset+region.size, prevRegionPos);
    454             curLabel = std::lower_bound(labels.begin(), labels.end(), prevRegionPos);
    455             curNamedLabel = std::lower_bound(namedLabels.begin(), namedLabels.end(),
    456                 std::make_pair(prevRegionPos, CString()),
    457                   [](const std::pair<size_t,CString>& a,
    458                                  const std::pair<size_t, CString>& b)
    459                   { return a.first < b.first; });
    460             isaDisassembler->writeLabelsToPosition(0, curLabel, curNamedLabel);
    461             isaDisassembler->flushOutput();
    462             // if last region is not kernel, then print labels after last region
    463             isaDisassembler->writeLabelsToEnd(region.size, curLabel, curNamedLabel);
    464             isaDisassembler->flushOutput();
    465         }
    466     }
     477        disassembleHSACOCode(output, rocmInput->regions,
     478                        rocmInput->codeSize, rocmInput->code, isaDisassembler, flags);
    467479}
Note: See TracChangeset for help on using the changeset viewer.