Ignore:
Timestamp:
Nov 28, 2016, 7:04:36 PM (3 years ago)
Author:
matszpk
Message:

CLRadeonExtender: AsmROCm: Some part of code for prepareBinary.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CLRadeonExtender/trunk/amdasm/AsmROCmFormat.cpp

    r2596 r2597  
    1919
    2020#include <CLRX/Config.h>
     21#include <cstdio>
    2122#include <cstring>
    2223#include <string>
     
    10791080bool AsmROCmHandler::prepareBinary()
    10801081{
    1081     return false;
     1082    bool good = true;
     1083    size_t sectionsNum = sections.size();
     1084    size_t kernelsNum = kernelStates.size();
     1085    output.deviceType = assembler.getDeviceType();
     1086   
     1087    if (assembler.isaAssembler!=nullptr)
     1088    {   // make last kernel registers pool updates
     1089        if (kcodeSelStack.empty())
     1090            saveKcodeCurrentAllocRegs();
     1091        else
     1092            while (!kcodeSelStack.empty())
     1093            {   // pop from kcode stack and apply changes
     1094                AsmROCmPseudoOps::updateKCodeSel(*this, kcodeSelection);
     1095                kcodeSelection = kcodeSelStack.top();
     1096                kcodeSelStack.pop();
     1097            }
     1098    }
     1099   
     1100    for (size_t i = 0; i < sectionsNum; i++)
     1101    {
     1102        const AsmSection& asmSection = assembler.sections[i];
     1103        const Section& section = sections[i];
     1104        const size_t sectionSize = asmSection.getSize();
     1105        const cxbyte* sectionData = (!asmSection.content.empty()) ?
     1106                asmSection.content.data() : (const cxbyte*)"";
     1107        switch(asmSection.type)
     1108        {
     1109            case AsmSectionType::CODE:
     1110                output.codeSize = sectionSize;
     1111                output.code = sectionData;
     1112                break;
     1113            case AsmSectionType::EXTRA_PROGBITS:
     1114            case AsmSectionType::EXTRA_NOTE:
     1115            case AsmSectionType::EXTRA_NOBITS:
     1116            case AsmSectionType::EXTRA_SECTION:
     1117            {
     1118                uint32_t elfSectType =
     1119                       (asmSection.type==AsmSectionType::EXTRA_NOTE) ? SHT_NOTE :
     1120                       (asmSection.type==AsmSectionType::EXTRA_NOBITS) ? SHT_NOBITS :
     1121                             SHT_PROGBITS;
     1122                uint32_t elfSectFlags =
     1123                    ((asmSection.flags&ASMELFSECT_ALLOCATABLE) ? SHF_ALLOC : 0) |
     1124                    ((asmSection.flags&ASMELFSECT_WRITEABLE) ? SHF_WRITE : 0) |
     1125                    ((asmSection.flags&ASMELFSECT_EXECUTABLE) ? SHF_EXECINSTR : 0);
     1126                output.extraSections.push_back({section.name, sectionSize, sectionData,
     1127                    asmSection.alignment!=0?asmSection.alignment:1, elfSectType,
     1128                    elfSectFlags, ELFSECTID_NULL, 0, 0 });
     1129                break;
     1130            }
     1131            case AsmSectionType::ROCM_CONFIG_CTRL_DIRECTIVE:
     1132                if (sectionSize != 128)
     1133                    assembler.printError(AsmSourcePos(),
     1134                         (std::string("Section '.control_directive' for kernel '")+
     1135                          assembler.kernels[section.kernelId].name+
     1136                          "' have wrong size").c_str());
     1137                break;
     1138            case AsmSectionType::ROCM_COMMENT:
     1139                output.commentSize = sectionSize;
     1140                output.comment = (const char*)sectionData;
     1141                break;
     1142            default:
     1143                break;
     1144        }
     1145    }
     1146   
     1147    GPUArchitecture arch = getGPUArchitectureFromDeviceType(assembler.deviceType);
     1148    // set up number of the allocated SGPRs and VGPRs for kernel
     1149    cxuint maxSGPRsNum = getGPUMaxRegistersNum(arch, REGTYPE_SGPR, 0);
     1150    // prepare kernels configuration
     1151    for (size_t i = 0; i < kernelStates.size(); i++)
     1152    {
     1153        const Kernel* kernel = kernelStates[i];
     1154        if (kernel->config.get() == nullptr)
     1155            continue;
     1156        const CString& kernelName = assembler.kernels[i].name;
     1157        AsmROCmKernelConfig& config = *kernel->config.get();
     1158        // setup config
     1159        cxuint userSGPRsNum = 4;
     1160        /* include userData sgprs */
     1161        cxuint dimMask = (config.dimMask!=BINGEN_DEFAULT) ? config.dimMask :
     1162                ((config.computePgmRsrc2>>7)&7);
     1163        // extra sgprs for dimensions
     1164        cxuint minRegsNum[2];
     1165        getGPUSetupMinRegistersNum(arch, dimMask, userSGPRsNum,
     1166                   ((config.tgSize) ? GPUSETUP_TGSIZE_EN : 0) |
     1167                   ((config.scratchBufferSize!=0) ? GPUSETUP_SCRATCH_EN : 0), minRegsNum);
     1168       
     1169        if (config.usedSGPRsNum!=BINGEN_DEFAULT && maxSGPRsNum < config.usedSGPRsNum)
     1170        {   // check only if sgprsnum set explicitly
     1171            char numBuf[64];
     1172            snprintf(numBuf, 64, "(max %u)", maxSGPRsNum);
     1173            assembler.printError(assembler.kernels[i].sourcePos, (std::string(
     1174                    "Number of total SGPRs for kernel '")+
     1175                    kernelName.c_str()+"' is too high "+numBuf).c_str());
     1176            good = false;
     1177        }
     1178       
     1179        if (config.usedSGPRsNum==BINGEN_DEFAULT)
     1180        {
     1181            config.usedSGPRsNum = std::min(
     1182                std::max(minRegsNum[0], kernelStates[i]->allocRegs[0]) +
     1183                    getGPUExtraRegsNum(arch, REGTYPE_SGPR, kernelStates[i]->allocRegFlags),
     1184                    maxSGPRsNum); // include all extra sgprs
     1185        }
     1186        if (config.usedVGPRsNum==BINGEN_DEFAULT)
     1187            config.usedVGPRsNum = std::max(minRegsNum[1], kernelStates[i]->allocRegs[1]);
     1188        // to little endian
     1189        SLEV(config.amdCodeVersionMajor, config.amdCodeVersionMajor);
     1190        SLEV(config.amdCodeVersionMinor, config.amdCodeVersionMinor);
     1191        SLEV(config.amdMachineKind, config.amdMachineKind);
     1192        SLEV(config.amdMachineMajor, config.amdMachineMajor);
     1193        SLEV(config.amdMachineMinor, config.amdMachineMinor);
     1194        SLEV(config.amdMachineStepping, config.amdMachineStepping);
     1195        SLEV(config.kernelCodeEntryOffset, config.kernelCodeEntryOffset);
     1196        SLEV(config.kernelCodePrefetchOffset, config.kernelCodePrefetchOffset);
     1197        SLEV(config.kernelCodePrefetchSize, config.kernelCodePrefetchSize);
     1198        SLEV(config.maxScrachBackingMemorySize, config.maxScrachBackingMemorySize);
     1199        SLEV(config.computePgmRsrc1, config.computePgmRsrc1);
     1200        SLEV(config.computePgmRsrc2, config.computePgmRsrc2);
     1201        SLEV(config.enableSpgrRegisterFlags, config.enableSpgrRegisterFlags);
     1202        SLEV(config.enableFeatureFlags, config.enableFeatureFlags);
     1203        SLEV(config.workitemPrivateSegmentSize, config.workitemPrivateSegmentSize);
     1204        SLEV(config.workgroupGroupSegmentSize, config.workgroupGroupSegmentSize);
     1205        SLEV(config.gdsSegmentSize, config.gdsSegmentSize);
     1206        SLEV(config.kernargSegmentSize, config.kernargSegmentSize);
     1207        SLEV(config.workgroupFbarrierCount, config.workgroupFbarrierCount);
     1208        SLEV(config.wavefrontSgprCount, config.wavefrontSgprCount);
     1209        SLEV(config.workitemVgprCount, config.workitemVgprCount);
     1210        SLEV(config.reservedVgprFirst, config.reservedVgprFirst);
     1211        SLEV(config.reservedVgprCount, config.reservedVgprCount);
     1212        SLEV(config.reservedSgprFirst, config.reservedSgprFirst);
     1213        SLEV(config.reservedSgprCount, config.reservedSgprCount);
     1214        SLEV(config.debugWavefrontPrivateSegmentOffsetSgpr,
     1215             config.debugWavefrontPrivateSegmentOffsetSgpr);
     1216        SLEV(config.debugPrivateSegmentBufferSgpr, config.debugPrivateSegmentBufferSgpr);
     1217        SLEV(config.callConvention, config.callConvention);
     1218        SLEV(config.runtimeLoaderKernelSymbol, config.runtimeLoaderKernelSymbol);
     1219    }
     1220   
     1221    const AsmSymbolMap& symbolMap = assembler.getSymbolMap();
     1222    for (size_t ki = 0; ki < output.symbols.size(); ki++)
     1223    {
     1224        ROCmSymbolInput& kinput = output.symbols[ki];
     1225        auto it = symbolMap.find(kinput.symbolName);
     1226        if (it == symbolMap.end() || !it->second.isDefined())
     1227        {   // error, undefined
     1228            assembler.printError(assembler.kernels[ki].sourcePos, (std::string(
     1229                        "Symbol for kernel '")+kinput.symbolName.c_str()+
     1230                        "' is undefined").c_str());
     1231            good = false;
     1232            continue;
     1233        }
     1234        const AsmSymbol& symbol = it->second;
     1235        if (!symbol.hasValue)
     1236        {   // error, unresolved
     1237            assembler.printError(assembler.kernels[ki].sourcePos, (std::string(
     1238                    "Symbol for kernel '") + kinput.symbolName.c_str() +
     1239                    "' is not resolved").c_str());
     1240            good = false;
     1241            continue;
     1242        }
     1243        if (symbol.sectionId != codeSection)
     1244        {   /// error, wrong section
     1245            assembler.printError(assembler.kernels[ki].sourcePos, (std::string(
     1246                    "Symbol for kernel '")+kinput.symbolName.c_str()+
     1247                    "' is defined for section other than '.text'").c_str());
     1248            good = false;
     1249            continue;
     1250        }
     1251        kinput.offset = symbol.value;
     1252    }
     1253    return good;
    10821254}
    10831255
    10841256void AsmROCmHandler::writeBinary(std::ostream& os) const
    10851257{
     1258    ROCmBinGenerator binGenerator(&output);
     1259    binGenerator.generate(os);
    10861260}
    10871261
    10881262void AsmROCmHandler::writeBinary(Array<cxbyte>& array) const
    10891263{
    1090 }
     1264    ROCmBinGenerator binGenerator(&output);
     1265    binGenerator.generate(array);
     1266}
Note: See TracChangeset for help on using the changeset viewer.