Changeset 2544 in CLRX


Ignore:
Timestamp:
Nov 6, 2016, 8:17:58 PM (4 years ago)
Author:
matszpk
Message:

CLRadeonExtender: ElfBinaries?: Tentative generation of elf hash table.

Location:
CLRadeonExtender/trunk
Files:
2 edited

Legend:

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

    r2541 r2544  
    707707    std::vector<ElfSymbolTemplate<Types> > dynSymbols;
    708708    uint32_t bucketsNum;
    709     std::unique_ptr<uint32_t> hashCodes;
     709    std::unique_ptr<uint32_t[]> hashCodes;
     710    bool isHashDynSym;
    710711   
    711712    void computeSize();
  • CLRadeonExtender/trunk/amdbin/ElfBinaries.cpp

    r2543 r2544  
    409409        : sizeComputed(false), addNullSym(true), addNullDynSym(true), addNullSection(true),
    410410          addrStartRegion(0), shStrTab(0), strTab(0), dynStr(0), shdrTabRegion(0),
    411           phdrTabRegion(0), bucketsNum(0)
     411          phdrTabRegion(0), bucketsNum(0), isHashDynSym(false)
    412412{ }
    413413
     
    419419          addNullSection(_addNullSection),  addrStartRegion(addrCountingFromRegion),
    420420          shStrTab(0), strTab(0), dynStr(0), shdrTabRegion(0), phdrTabRegion(0),
    421           header(_header), bucketsNum(0)
     421          header(_header), bucketsNum(0), isHashDynSym(false)
    422422{ }
    423423
     
    444444    size = sizeof(typename Types::Ehdr);
    445445    sectionsNum = addNullSection; // if add null section
     446    cxuint hashSymSectionIdx = UINT_MAX;
    446447    for (const auto& region: regions)
    447448        if (region.type == ElfRegionType::SECTION)
     449        {
     450            if (region.section.type==SHT_HASH &&
     451                ::strcmp(region.section.name, ".hash")==0)
     452                hashSymSectionIdx = region.section.link;
    448453            sectionsNum++;
     454        }
     455   
     456    /// determine symbol name
     457    cxuint sectionCount = addNullSection;
     458    isHashDynSym = false;
     459    if (hashSymSectionIdx!=UINT_MAX)
     460    {
     461        bool hashSymDetected = false;
     462        for (const auto& region: regions)
     463            if (region.type == ElfRegionType::SECTION)
     464            {
     465                if (hashSymSectionIdx==sectionCount)
     466                {   // get smybol section
     467                    if (region.section.type==SHT_SYMTAB)
     468                    {
     469                        isHashDynSym = false;
     470                        hashSymDetected = true;
     471                    }
     472                    else if (region.section.type==SHT_DYNSYM)
     473                    {
     474                        isHashDynSym = true;
     475                        hashSymDetected = true;
     476                    }
     477                    else
     478                        throw Exception("Wrong Hash Sym section!");
     479                }
     480                sectionCount++;
     481            }
     482        if (!hashSymDetected)
     483            throw Exception("Wrong Hash Sym is not detected!");
     484    }
    449485   
    450486    sectionRegions.reset(new cxuint[sectionsNum+1]);
    451487    sectionRegions[0] = UINT_MAX;
    452     cxuint sectionCount = addNullSection;
     488    sectionCount = addNullSection;
    453489    typename Types::Word address = 0;
    454490   
     
    512548                else if (region.section.type == SHT_HASH)
    513549                {
    514                     //calculateHashValuesForSymbols<>()
     550                    const std::vector<ElfSymbolTemplate<Types> >& hashSymbols =
     551                        (isHashDynSym) ? dynSymbols : symbols;
     552                    bool addNullHashSym = (isHashDynSym) ? addNullDynSym : addNullSym;
     553                    hashCodes = calculateHashValuesForSymbols(addNullDynSym, hashSymbols);
     554                    bucketsNum = optimizeHashBucketsNum(hashSymbols.size()+addNullHashSym,
     555                           addNullHashSym, hashCodes.get());
     556                    size += 4*(bucketsNum + hashSymbols.size()+addNullHashSym + 2);
    515557                }
    516558                else if (region.section.type == SHT_STRTAB)
     
    572614                           const uint32_t* hashCodes, uint32_t* output)
    573615{
    574     SULEV(output[0], bucketsNum);
    575     SULEV(output[1], hashNum);
     616    SLEV(output[0], bucketsNum);
     617    SLEV(output[1], hashNum);
    576618    uint32_t* buckets = output + 2;
    577619    uint32_t* chains = output + bucketsNum + 2;
     
    586628        if (lastNodes[bucket] == UINT32_MAX)
    587629        {   // first entry of chain
    588             SULEV(buckets[bucket], i);
     630            SLEV(buckets[bucket], i);
    589631            lastNodes[bucket] = i;
    590632        }
    591633        else
    592634        {
    593             SULEV(chains[lastNodes[bucket]], i);
     635            SLEV(chains[lastNodes[bucket]], i);
    594636            lastNodes[bucket] = i;
    595637        }
     
    886928                    if (::strcmp(region.section.name, ".hash") != 0)
    887929                        continue;
     930                   
     931                    const std::vector<ElfSymbolTemplate<Types> >& hashSymbols =
     932                        (isHashDynSym) ? dynSymbols : symbols;
     933                    bool addNullHashSym = (isHashDynSym) ? addNullDynSym : addNullSym;
     934                    Array<uint32_t> hashTable(2 + hashSymbols.size() + addNullHashSym);
     935                    createHashTable(bucketsNum, hashSymbols.size()+addNullHashSym,
     936                                addNullHashSym, hashCodes.get(), hashTable.data());
     937                    fob.writeArray(hashTable.size(), hashTable.data());
    888938                }
    889939                else if (region.section.type == SHT_STRTAB)
Note: See TracChangeset for help on using the changeset viewer.