brig_object.cc revision 11308
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 2012-2015 Advanced Micro Devices, Inc.
311308Santhony.gutierrez@amd.com * All rights reserved.
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * For use for simulation and test purposes only
611308Santhony.gutierrez@amd.com *
711308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without
811308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are met:
911308Santhony.gutierrez@amd.com *
1011308Santhony.gutierrez@amd.com * 1. Redistributions of source code must retain the above copyright notice,
1111308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer.
1211308Santhony.gutierrez@amd.com *
1311308Santhony.gutierrez@amd.com * 2. Redistributions in binary form must reproduce the above copyright notice,
1411308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer in the documentation
1511308Santhony.gutierrez@amd.com * and/or other materials provided with the distribution.
1611308Santhony.gutierrez@amd.com *
1711308Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its contributors
1811308Santhony.gutierrez@amd.com * may be used to endorse or promote products derived from this software
1911308Santhony.gutierrez@amd.com * without specific prior written permission.
2011308Santhony.gutierrez@amd.com *
2111308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2211308Santhony.gutierrez@amd.com * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2311308Santhony.gutierrez@amd.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2411308Santhony.gutierrez@amd.com * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2511308Santhony.gutierrez@amd.com * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2611308Santhony.gutierrez@amd.com * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2711308Santhony.gutierrez@amd.com * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2811308Santhony.gutierrez@amd.com * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2911308Santhony.gutierrez@amd.com * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3011308Santhony.gutierrez@amd.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3111308Santhony.gutierrez@amd.com * POSSIBILITY OF SUCH DAMAGE.
3211308Santhony.gutierrez@amd.com *
3311308Santhony.gutierrez@amd.com * Author: Steve Reinhardt, Anthony Gutierrez
3411308Santhony.gutierrez@amd.com */
3511308Santhony.gutierrez@amd.com
3611308Santhony.gutierrez@amd.com#include "gpu-compute/brig_object.hh"
3711308Santhony.gutierrez@amd.com
3811308Santhony.gutierrez@amd.com#include <fcntl.h>
3911308Santhony.gutierrez@amd.com#include <sys/mman.h>
4011308Santhony.gutierrez@amd.com#include <sys/types.h>
4111308Santhony.gutierrez@amd.com#include <unistd.h>
4211308Santhony.gutierrez@amd.com
4311308Santhony.gutierrez@amd.com#include <cassert>
4411308Santhony.gutierrez@amd.com#include <cstddef>
4511308Santhony.gutierrez@amd.com#include <cstdlib>
4611308Santhony.gutierrez@amd.com
4711308Santhony.gutierrez@amd.com#include "arch/hsail/Brig.h"
4811308Santhony.gutierrez@amd.com#include "base/misc.hh"
4911308Santhony.gutierrez@amd.com#include "base/trace.hh"
5011308Santhony.gutierrez@amd.com#include "debug/BRIG.hh"
5111308Santhony.gutierrez@amd.com#include "debug/HSAILObject.hh"
5211308Santhony.gutierrez@amd.com#include "debug/HSALoader.hh"
5311308Santhony.gutierrez@amd.com
5411308Santhony.gutierrez@amd.comusing namespace Brig;
5511308Santhony.gutierrez@amd.com
5611308Santhony.gutierrez@amd.comstd::vector<std::function<HsaObject*(const std::string&, int, uint8_t*)>>
5711308Santhony.gutierrez@amd.com    HsaObject::tryFileFuncs = { BrigObject::tryFile };
5811308Santhony.gutierrez@amd.com
5911308Santhony.gutierrez@amd.comextern int getBrigDataTypeBytes(BrigType16_t t);
6011308Santhony.gutierrez@amd.com
6111308Santhony.gutierrez@amd.comconst char *BrigObject::sectionNames[] =
6211308Santhony.gutierrez@amd.com{
6311308Santhony.gutierrez@amd.com    "hsa_data",
6411308Santhony.gutierrez@amd.com    "hsa_code",
6511308Santhony.gutierrez@amd.com    "hsa_operand",
6611308Santhony.gutierrez@amd.com    ".shstrtab"
6711308Santhony.gutierrez@amd.com};
6811308Santhony.gutierrez@amd.com
6911308Santhony.gutierrez@amd.comconst char *segmentNames[] =
7011308Santhony.gutierrez@amd.com{
7111308Santhony.gutierrez@amd.com    "none",
7211308Santhony.gutierrez@amd.com    "flat",
7311308Santhony.gutierrez@amd.com    "global",
7411308Santhony.gutierrez@amd.com    "readonly",
7511308Santhony.gutierrez@amd.com    "kernarg",
7611308Santhony.gutierrez@amd.com    "group",
7711308Santhony.gutierrez@amd.com    "private",
7811308Santhony.gutierrez@amd.com    "spill",
7911308Santhony.gutierrez@amd.com    "args"
8011308Santhony.gutierrez@amd.com};
8111308Santhony.gutierrez@amd.com
8211308Santhony.gutierrez@amd.comconst uint8_t*
8311308Santhony.gutierrez@amd.comBrigObject::getSectionOffset(enum SectionIndex sec, int offs) const
8411308Santhony.gutierrez@amd.com{
8511308Santhony.gutierrez@amd.com    // allow offs == size for dummy end pointers
8611308Santhony.gutierrez@amd.com    assert(offs <= sectionInfo[sec].size);
8711308Santhony.gutierrez@amd.com
8811308Santhony.gutierrez@amd.com    return sectionInfo[sec].ptr + offs;
8911308Santhony.gutierrez@amd.com}
9011308Santhony.gutierrez@amd.com
9111308Santhony.gutierrez@amd.comconst char*
9211308Santhony.gutierrez@amd.comBrigObject::getString(int offs) const
9311308Santhony.gutierrez@amd.com{
9411308Santhony.gutierrez@amd.com    return (const char*)(getSectionOffset(DataSectionIndex, offs) + 4);
9511308Santhony.gutierrez@amd.com}
9611308Santhony.gutierrez@amd.com
9711308Santhony.gutierrez@amd.comconst BrigBase*
9811308Santhony.gutierrez@amd.comBrigObject::getCodeSectionEntry(int offs) const
9911308Santhony.gutierrez@amd.com{
10011308Santhony.gutierrez@amd.com    return (const BrigBase*)getSectionOffset(CodeSectionIndex, offs);
10111308Santhony.gutierrez@amd.com}
10211308Santhony.gutierrez@amd.com
10311308Santhony.gutierrez@amd.comconst BrigData*
10411308Santhony.gutierrez@amd.comBrigObject::getBrigBaseData(int offs) const
10511308Santhony.gutierrez@amd.com{
10611308Santhony.gutierrez@amd.com    return (Brig::BrigData*)(getSectionOffset(DataSectionIndex, offs));
10711308Santhony.gutierrez@amd.com}
10811308Santhony.gutierrez@amd.com
10911308Santhony.gutierrez@amd.comconst uint8_t*
11011308Santhony.gutierrez@amd.comBrigObject::getData(int offs) const
11111308Santhony.gutierrez@amd.com{
11211308Santhony.gutierrez@amd.com    return getSectionOffset(DataSectionIndex, offs);
11311308Santhony.gutierrez@amd.com}
11411308Santhony.gutierrez@amd.com
11511308Santhony.gutierrez@amd.comconst BrigOperand*
11611308Santhony.gutierrez@amd.comBrigObject::getOperand(int offs) const
11711308Santhony.gutierrez@amd.com{
11811308Santhony.gutierrez@amd.com    return (const BrigOperand*)getSectionOffset(OperandsSectionIndex, offs);
11911308Santhony.gutierrez@amd.com}
12011308Santhony.gutierrez@amd.com
12111308Santhony.gutierrez@amd.comunsigned
12211308Santhony.gutierrez@amd.comBrigObject::getOperandPtr(int offs, int index) const
12311308Santhony.gutierrez@amd.com{
12411308Santhony.gutierrez@amd.com    unsigned *op_offs = (unsigned*)(getData(offs + 4 * (index + 1)));
12511308Santhony.gutierrez@amd.com
12611308Santhony.gutierrez@amd.com    return *op_offs;
12711308Santhony.gutierrez@amd.com}
12811308Santhony.gutierrez@amd.com
12911308Santhony.gutierrez@amd.comconst BrigInstBase*
13011308Santhony.gutierrez@amd.comBrigObject::getInst(int offs) const
13111308Santhony.gutierrez@amd.com{
13211308Santhony.gutierrez@amd.com    return (const BrigInstBase*)getSectionOffset(CodeSectionIndex, offs);
13311308Santhony.gutierrez@amd.com}
13411308Santhony.gutierrez@amd.com
13511308Santhony.gutierrez@amd.comHsaCode*
13611308Santhony.gutierrez@amd.comBrigObject::getKernel(const std::string &name) const
13711308Santhony.gutierrez@amd.com{
13811308Santhony.gutierrez@amd.com    return nullptr;
13911308Santhony.gutierrez@amd.com}
14011308Santhony.gutierrez@amd.com
14111308Santhony.gutierrez@amd.comHsaCode*
14211308Santhony.gutierrez@amd.comBrigObject::getFunction(const std::string &name) const
14311308Santhony.gutierrez@amd.com{
14411308Santhony.gutierrez@amd.com    for (int i = 0; i < functions.size(); ++i) {
14511308Santhony.gutierrez@amd.com        if (functions[i]->name() == name) {
14611308Santhony.gutierrez@amd.com            return functions[i];
14711308Santhony.gutierrez@amd.com        }
14811308Santhony.gutierrez@amd.com    }
14911308Santhony.gutierrez@amd.com
15011308Santhony.gutierrez@amd.com    return nullptr;
15111308Santhony.gutierrez@amd.com}
15211308Santhony.gutierrez@amd.com
15311308Santhony.gutierrez@amd.comvoid
15411308Santhony.gutierrez@amd.comBrigObject::processDirectives(const BrigBase *dirPtr, const BrigBase *endPtr,
15511308Santhony.gutierrez@amd.com                              StorageMap *storageMap)
15611308Santhony.gutierrez@amd.com{
15711308Santhony.gutierrez@amd.com    while (dirPtr < endPtr) {
15811308Santhony.gutierrez@amd.com        if (!dirPtr->byteCount) {
15911308Santhony.gutierrez@amd.com            fatal("Bad directive size 0\n");
16011308Santhony.gutierrez@amd.com        }
16111308Santhony.gutierrez@amd.com
16211308Santhony.gutierrez@amd.com        // calculate next pointer now so we can override it if needed
16311308Santhony.gutierrez@amd.com        const BrigBase *nextDirPtr = brigNext(dirPtr);
16411308Santhony.gutierrez@amd.com
16511308Santhony.gutierrez@amd.com        DPRINTF(HSAILObject, "Code section entry kind: #%x, byte count: %d\n",
16611308Santhony.gutierrez@amd.com                dirPtr->kind, dirPtr->byteCount);
16711308Santhony.gutierrez@amd.com
16811308Santhony.gutierrez@amd.com        switch (dirPtr->kind) {
16911308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_FUNCTION:
17011308Santhony.gutierrez@amd.com            {
17111308Santhony.gutierrez@amd.com                const BrigDirectiveExecutable *p M5_VAR_USED =
17211308Santhony.gutierrez@amd.com                    reinterpret_cast<const BrigDirectiveExecutable*>(dirPtr);
17311308Santhony.gutierrez@amd.com
17411308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject,"DIRECTIVE_FUNCTION: %s offset: "
17511308Santhony.gutierrez@amd.com                        "%d next: %d\n", getString(p->name),
17611308Santhony.gutierrez@amd.com                        p->firstCodeBlockEntry, p->nextModuleEntry);
17711308Santhony.gutierrez@amd.com
17811308Santhony.gutierrez@amd.com                if (p->firstCodeBlockEntry != p->nextModuleEntry) {
17911308Santhony.gutierrez@amd.com                    panic("Function calls are not fully supported yet!!: %s\n",
18011308Santhony.gutierrez@amd.com                          getString(p->name));
18111308Santhony.gutierrez@amd.com
18211308Santhony.gutierrez@amd.com                    const char *name = getString(p->name);
18311308Santhony.gutierrez@amd.com
18411308Santhony.gutierrez@amd.com                    HsailCode *code_obj = nullptr;
18511308Santhony.gutierrez@amd.com
18611308Santhony.gutierrez@amd.com                    for (int i = 0; i < functions.size(); ++i) {
18711308Santhony.gutierrez@amd.com                        if (functions[i]->name() == name) {
18811308Santhony.gutierrez@amd.com                            code_obj = functions[i];
18911308Santhony.gutierrez@amd.com                            break;
19011308Santhony.gutierrez@amd.com                        }
19111308Santhony.gutierrez@amd.com                    }
19211308Santhony.gutierrez@amd.com
19311308Santhony.gutierrez@amd.com                    if (!code_obj) {
19411308Santhony.gutierrez@amd.com                        // create new local storage map for kernel-local symbols
19511308Santhony.gutierrez@amd.com                        code_obj = new HsailCode(name, p, this,
19611308Santhony.gutierrez@amd.com                                                 new StorageMap(storageMap));
19711308Santhony.gutierrez@amd.com                        functions.push_back(code_obj);
19811308Santhony.gutierrez@amd.com                    } else {
19911308Santhony.gutierrez@amd.com                        panic("Multiple definition of Function!!: %s\n",
20011308Santhony.gutierrez@amd.com                              getString(p->name));
20111308Santhony.gutierrez@amd.com                    }
20211308Santhony.gutierrez@amd.com
20311308Santhony.gutierrez@amd.com                }
20411308Santhony.gutierrez@amd.com                nextDirPtr = getCodeSectionEntry(p->nextModuleEntry);
20511308Santhony.gutierrez@amd.com            }
20611308Santhony.gutierrez@amd.com            break;
20711308Santhony.gutierrez@amd.com
20811308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_KERNEL:
20911308Santhony.gutierrez@amd.com            {
21011308Santhony.gutierrez@amd.com                const BrigDirectiveExecutable *p =
21111308Santhony.gutierrez@amd.com                    reinterpret_cast<const BrigDirectiveExecutable*>(dirPtr);
21211308Santhony.gutierrez@amd.com
21311308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject,"DIRECTIVE_KERNEL: %s offset: %d count: "
21411308Santhony.gutierrez@amd.com                        "next: %d\n", getString(p->name),
21511308Santhony.gutierrez@amd.com                        p->firstCodeBlockEntry, p->nextModuleEntry);
21611308Santhony.gutierrez@amd.com
21711308Santhony.gutierrez@amd.com                const char *name = getString(p->name);
21811308Santhony.gutierrez@amd.com
21911308Santhony.gutierrez@amd.com                if (name[0] == '&')
22011308Santhony.gutierrez@amd.com                    name++;
22111308Santhony.gutierrez@amd.com
22211308Santhony.gutierrez@amd.com                std::string str = name;
22311308Santhony.gutierrez@amd.com                char *temp;
22411308Santhony.gutierrez@amd.com                int len = str.length();
22511308Santhony.gutierrez@amd.com
22611308Santhony.gutierrez@amd.com                if (str[len - 1] >= 'a' && str[len - 1] <= 'z') {
22711308Santhony.gutierrez@amd.com                    temp = new char[str.size() + 1];
22811308Santhony.gutierrez@amd.com                    std::copy(str.begin(), str.end() , temp);
22911308Santhony.gutierrez@amd.com                    temp[str.size()] = '\0';
23011308Santhony.gutierrez@amd.com                } else {
23111308Santhony.gutierrez@amd.com                    temp = new char[str.size()];
23211308Santhony.gutierrez@amd.com                    std::copy(str.begin(), str.end() - 1 , temp);
23311308Santhony.gutierrez@amd.com                    temp[str.size() - 1 ] = '\0';
23411308Santhony.gutierrez@amd.com                }
23511308Santhony.gutierrez@amd.com
23611308Santhony.gutierrez@amd.com                std::string kernel_name = temp;
23711308Santhony.gutierrez@amd.com                delete[] temp;
23811308Santhony.gutierrez@amd.com
23911308Santhony.gutierrez@amd.com                HsailCode *code_obj = nullptr;
24011308Santhony.gutierrez@amd.com
24111308Santhony.gutierrez@amd.com                for (const auto &kernel : kernels) {
24211308Santhony.gutierrez@amd.com                    if (kernel->name() == kernel_name) {
24311308Santhony.gutierrez@amd.com                        code_obj = kernel;
24411308Santhony.gutierrez@amd.com                        break;
24511308Santhony.gutierrez@amd.com                    }
24611308Santhony.gutierrez@amd.com                }
24711308Santhony.gutierrez@amd.com
24811308Santhony.gutierrez@amd.com                if (!code_obj) {
24911308Santhony.gutierrez@amd.com                    // create new local storage map for kernel-local symbols
25011308Santhony.gutierrez@amd.com                    code_obj = new HsailCode(kernel_name, p, this,
25111308Santhony.gutierrez@amd.com                                             new StorageMap(storageMap));
25211308Santhony.gutierrez@amd.com
25311308Santhony.gutierrez@amd.com                    kernels.push_back(code_obj);
25411308Santhony.gutierrez@amd.com                }
25511308Santhony.gutierrez@amd.com
25611308Santhony.gutierrez@amd.com                nextDirPtr = getCodeSectionEntry(p->nextModuleEntry);
25711308Santhony.gutierrez@amd.com            }
25811308Santhony.gutierrez@amd.com            break;
25911308Santhony.gutierrez@amd.com
26011308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_VARIABLE:
26111308Santhony.gutierrez@amd.com            {
26211308Santhony.gutierrez@amd.com                const BrigDirectiveVariable *p =
26311308Santhony.gutierrez@amd.com                    reinterpret_cast<const BrigDirectiveVariable*>(dirPtr);
26411308Santhony.gutierrez@amd.com
26511308Santhony.gutierrez@amd.com                uint64_t readonlySize_old =
26611308Santhony.gutierrez@amd.com                    storageMap->getSize(BRIG_SEGMENT_READONLY);
26711308Santhony.gutierrez@amd.com
26811308Santhony.gutierrez@amd.com                StorageElement* se = storageMap->addSymbol(p, this);
26911308Santhony.gutierrez@amd.com
27011308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "DIRECTIVE_VARIABLE, symbol %s\n",
27111308Santhony.gutierrez@amd.com                        getString(p->name));
27211308Santhony.gutierrez@amd.com
27311308Santhony.gutierrez@amd.com                if (p->segment == BRIG_SEGMENT_READONLY) {
27411308Santhony.gutierrez@amd.com                    // readonly memory has initialization data
27511308Santhony.gutierrez@amd.com                    uint8_t* readonlyData_old = readonlyData;
27611308Santhony.gutierrez@amd.com
27711308Santhony.gutierrez@amd.com                    readonlyData =
27811308Santhony.gutierrez@amd.com                        new uint8_t[storageMap->getSize(BRIG_SEGMENT_READONLY)];
27911308Santhony.gutierrez@amd.com
28011308Santhony.gutierrez@amd.com                    if (p->init) {
28111308Santhony.gutierrez@amd.com                        if ((p->type == BRIG_TYPE_ROIMG) ||
28211308Santhony.gutierrez@amd.com                            (p->type == BRIG_TYPE_WOIMG) ||
28311308Santhony.gutierrez@amd.com                            (p->type == BRIG_TYPE_SAMP) ||
28411308Santhony.gutierrez@amd.com                            (p->type == BRIG_TYPE_SIG32) ||
28511308Santhony.gutierrez@amd.com                            (p->type == BRIG_TYPE_SIG64)) {
28611308Santhony.gutierrez@amd.com                            panic("Read only data type not supported: %s\n",
28711308Santhony.gutierrez@amd.com                                  getString(p->name));
28811308Santhony.gutierrez@amd.com                        }
28911308Santhony.gutierrez@amd.com
29011308Santhony.gutierrez@amd.com                        const BrigOperand *brigOp = getOperand(p->init);
29111308Santhony.gutierrez@amd.com                        assert(brigOp->kind ==
29211308Santhony.gutierrez@amd.com                               BRIG_KIND_OPERAND_CONSTANT_BYTES);
29311308Santhony.gutierrez@amd.com
29411308Santhony.gutierrez@amd.com                        const Brig::BrigData *operand_data M5_VAR_USED =
29511308Santhony.gutierrez@amd.com                            getBrigBaseData(((BrigOperandConstantBytes*)
29611308Santhony.gutierrez@amd.com                                            brigOp)->bytes);
29711308Santhony.gutierrez@amd.com
29811308Santhony.gutierrez@amd.com                        assert((operand_data->byteCount / 4) > 0);
29911308Santhony.gutierrez@amd.com
30011308Santhony.gutierrez@amd.com                        uint8_t *symbol_data =
30111308Santhony.gutierrez@amd.com                            (uint8_t*)getData(((BrigOperandConstantBytes*)
30211308Santhony.gutierrez@amd.com                                              brigOp)->bytes + 4);
30311308Santhony.gutierrez@amd.com
30411308Santhony.gutierrez@amd.com                        // copy the old data and add the new data
30511308Santhony.gutierrez@amd.com                        if (readonlySize_old > 0) {
30611308Santhony.gutierrez@amd.com                            memcpy(readonlyData, readonlyData_old,
30711308Santhony.gutierrez@amd.com                                   readonlySize_old);
30811308Santhony.gutierrez@amd.com                        }
30911308Santhony.gutierrez@amd.com
31011308Santhony.gutierrez@amd.com                        memcpy(readonlyData + se->offset, symbol_data,
31111308Santhony.gutierrez@amd.com                               se->size);
31211308Santhony.gutierrez@amd.com
31311308Santhony.gutierrez@amd.com                        delete[] readonlyData_old;
31411308Santhony.gutierrez@amd.com                   }
31511308Santhony.gutierrez@amd.com                }
31611308Santhony.gutierrez@amd.com            }
31711308Santhony.gutierrez@amd.com            break;
31811308Santhony.gutierrez@amd.com
31911308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_LABEL:
32011308Santhony.gutierrez@amd.com            {
32111308Santhony.gutierrez@amd.com              const BrigDirectiveLabel M5_VAR_USED *p =
32211308Santhony.gutierrez@amd.com                    reinterpret_cast<const BrigDirectiveLabel*>(dirPtr);
32311308Santhony.gutierrez@amd.com
32411308Santhony.gutierrez@amd.com              panic("Label directives cannot be at the module level: %s\n",
32511308Santhony.gutierrez@amd.com                    getString(p->name));
32611308Santhony.gutierrez@amd.com
32711308Santhony.gutierrez@amd.com            }
32811308Santhony.gutierrez@amd.com            break;
32911308Santhony.gutierrez@amd.com
33011308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_COMMENT:
33111308Santhony.gutierrez@amd.com            {
33211308Santhony.gutierrez@amd.com              const BrigDirectiveComment M5_VAR_USED *p =
33311308Santhony.gutierrez@amd.com                  reinterpret_cast<const BrigDirectiveComment*>(dirPtr);
33411308Santhony.gutierrez@amd.com
33511308Santhony.gutierrez@amd.com              DPRINTF(HSAILObject, "DIRECTIVE_COMMENT: %s\n",
33611308Santhony.gutierrez@amd.com                      getString(p->name));
33711308Santhony.gutierrez@amd.com            }
33811308Santhony.gutierrez@amd.com            break;
33911308Santhony.gutierrez@amd.com
34011308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_LOC:
34111308Santhony.gutierrez@amd.com            {
34211308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "BRIG_DIRECTIVE_LOC\n");
34311308Santhony.gutierrez@amd.com            }
34411308Santhony.gutierrez@amd.com            break;
34511308Santhony.gutierrez@amd.com
34611308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_MODULE:
34711308Santhony.gutierrez@amd.com            {
34811308Santhony.gutierrez@amd.com                const BrigDirectiveModule M5_VAR_USED *p =
34911308Santhony.gutierrez@amd.com                    reinterpret_cast<const BrigDirectiveModule*>(dirPtr);
35011308Santhony.gutierrez@amd.com
35111308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "BRIG_DIRECTIVE_MODULE: %s\n",
35211308Santhony.gutierrez@amd.com                        getString(p->name));
35311308Santhony.gutierrez@amd.com            }
35411308Santhony.gutierrez@amd.com            break;
35511308Santhony.gutierrez@amd.com
35611308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_CONTROL:
35711308Santhony.gutierrez@amd.com            {
35811308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "DIRECTIVE_CONTROL\n");
35911308Santhony.gutierrez@amd.com            }
36011308Santhony.gutierrez@amd.com            break;
36111308Santhony.gutierrez@amd.com
36211308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_PRAGMA:
36311308Santhony.gutierrez@amd.com            {
36411308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "DIRECTIVE_PRAGMA\n");
36511308Santhony.gutierrez@amd.com            }
36611308Santhony.gutierrez@amd.com            break;
36711308Santhony.gutierrez@amd.com
36811308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_EXTENSION:
36911308Santhony.gutierrez@amd.com            {
37011308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "DIRECTIVE_EXTENSION\n");
37111308Santhony.gutierrez@amd.com            }
37211308Santhony.gutierrez@amd.com            break;
37311308Santhony.gutierrez@amd.com
37411308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_ARG_BLOCK_START:
37511308Santhony.gutierrez@amd.com            {
37611308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "DIRECTIVE_ARG_BLOCK_START\n");
37711308Santhony.gutierrez@amd.com            }
37811308Santhony.gutierrez@amd.com            break;
37911308Santhony.gutierrez@amd.com
38011308Santhony.gutierrez@amd.com          case BRIG_KIND_DIRECTIVE_ARG_BLOCK_END:
38111308Santhony.gutierrez@amd.com            {
38211308Santhony.gutierrez@amd.com                DPRINTF(HSAILObject, "DIRECTIVE_ARG_BLOCK_END\n");
38311308Santhony.gutierrez@amd.com            }
38411308Santhony.gutierrez@amd.com            break;
38511308Santhony.gutierrez@amd.com          default:
38611308Santhony.gutierrez@amd.com            if (dirPtr->kind >= BRIG_KIND_INST_BEGIN &&
38711308Santhony.gutierrez@amd.com                dirPtr->kind <= BRIG_KIND_INST_END)
38811308Santhony.gutierrez@amd.com                break;
38911308Santhony.gutierrez@amd.com
39011308Santhony.gutierrez@amd.com            if (dirPtr->kind >= BRIG_KIND_OPERAND_BEGIN &&
39111308Santhony.gutierrez@amd.com                dirPtr->kind <= BRIG_KIND_OPERAND_END)
39211308Santhony.gutierrez@amd.com                break;
39311308Santhony.gutierrez@amd.com
39411308Santhony.gutierrez@amd.com            warn("Unknown Brig directive kind: %d\n", dirPtr->kind);
39511308Santhony.gutierrez@amd.com            break;
39611308Santhony.gutierrez@amd.com        }
39711308Santhony.gutierrez@amd.com
39811308Santhony.gutierrez@amd.com        dirPtr = nextDirPtr;
39911308Santhony.gutierrez@amd.com    }
40011308Santhony.gutierrez@amd.com}
40111308Santhony.gutierrez@amd.com
40211308Santhony.gutierrez@amd.comHsaObject*
40311308Santhony.gutierrez@amd.comBrigObject::tryFile(const std::string &fname, int len, uint8_t *fileData)
40411308Santhony.gutierrez@amd.com{
40511308Santhony.gutierrez@amd.com    const char *brig_ident = "HSA BRIG";
40611308Santhony.gutierrez@amd.com
40711308Santhony.gutierrez@amd.com    if (memcmp(brig_ident, fileData, MODULE_IDENTIFICATION_LENGTH))
40811308Santhony.gutierrez@amd.com        return nullptr;
40911308Santhony.gutierrez@amd.com
41011308Santhony.gutierrez@amd.com    return new BrigObject(fname, len, fileData);
41111308Santhony.gutierrez@amd.com}
41211308Santhony.gutierrez@amd.com
41311308Santhony.gutierrez@amd.comBrigObject::BrigObject(const std::string &fname, int len, uint8_t *fileData)
41411308Santhony.gutierrez@amd.com    : HsaObject(fname), storageMap(new StorageMap())
41511308Santhony.gutierrez@amd.com{
41611308Santhony.gutierrez@amd.com    const char *brig_ident = "HSA BRIG";
41711308Santhony.gutierrez@amd.com    BrigModuleHeader *mod_hdr = (BrigModuleHeader*)fileData;
41811308Santhony.gutierrez@amd.com
41911308Santhony.gutierrez@amd.com    fatal_if(memcmp(brig_ident, mod_hdr, MODULE_IDENTIFICATION_LENGTH),
42011308Santhony.gutierrez@amd.com             "%s is not a BRIG file\n", fname);
42111308Santhony.gutierrez@amd.com
42211308Santhony.gutierrez@amd.com    if (mod_hdr->brigMajor != BRIG_VERSION_BRIG_MAJOR ||
42311308Santhony.gutierrez@amd.com        mod_hdr->brigMinor != BRIG_VERSION_BRIG_MINOR) {
42411308Santhony.gutierrez@amd.com        fatal("%s: BRIG version mismatch, %d.%d != %d.%d\n",
42511308Santhony.gutierrez@amd.com              fname, mod_hdr->brigMajor, mod_hdr->brigMinor,
42611308Santhony.gutierrez@amd.com              BRIG_VERSION_BRIG_MAJOR, BRIG_VERSION_BRIG_MINOR);
42711308Santhony.gutierrez@amd.com    }
42811308Santhony.gutierrez@amd.com
42911308Santhony.gutierrez@amd.com    fatal_if(mod_hdr->sectionCount != NumSectionIndices, "%s: BRIG section "
43011308Santhony.gutierrez@amd.com             "count (%d) != expected value (%d)\n", fname,
43111308Santhony.gutierrez@amd.com             mod_hdr->sectionCount, NumSectionIndices);
43211308Santhony.gutierrez@amd.com
43311308Santhony.gutierrez@amd.com    for (int i = 0; i < NumSectionIndices; ++i) {
43411308Santhony.gutierrez@amd.com        sectionInfo[i].ptr = nullptr;
43511308Santhony.gutierrez@amd.com    }
43611308Santhony.gutierrez@amd.com
43711308Santhony.gutierrez@amd.com    uint64_t *sec_idx_table = (uint64_t*)(fileData + mod_hdr->sectionIndex);
43811308Santhony.gutierrez@amd.com    for (int sec_idx = 0; sec_idx < mod_hdr->sectionCount; ++sec_idx) {
43911308Santhony.gutierrez@amd.com        uint8_t *sec_hdr_byte_ptr = fileData + sec_idx_table[sec_idx];
44011308Santhony.gutierrez@amd.com        BrigSectionHeader *sec_hdr = (BrigSectionHeader*)sec_hdr_byte_ptr;
44111308Santhony.gutierrez@amd.com
44211308Santhony.gutierrez@amd.com        // It doesn't look like cprintf supports string precision values,
44311308Santhony.gutierrez@amd.com        // but if this breaks, the right answer is to fix that
44411308Santhony.gutierrez@amd.com        DPRINTF(HSAILObject, "found section %.*s\n", sec_hdr->nameLength,
44511308Santhony.gutierrez@amd.com                sec_hdr->name);
44611308Santhony.gutierrez@amd.com
44711308Santhony.gutierrez@amd.com        sectionInfo[sec_idx].ptr = new uint8_t[sec_hdr->byteCount];
44811308Santhony.gutierrez@amd.com        memcpy(sectionInfo[sec_idx].ptr, sec_hdr_byte_ptr, sec_hdr->byteCount);
44911308Santhony.gutierrez@amd.com        sectionInfo[sec_idx].size = sec_hdr->byteCount;
45011308Santhony.gutierrez@amd.com    }
45111308Santhony.gutierrez@amd.com
45211308Santhony.gutierrez@amd.com    BrigSectionHeader *code_hdr =
45311308Santhony.gutierrez@amd.com        (BrigSectionHeader*)sectionInfo[CodeSectionIndex].ptr;
45411308Santhony.gutierrez@amd.com
45511308Santhony.gutierrez@amd.com    DPRINTF(HSAILObject, "Code section hdr, count: %d, hdr count: %d, "
45611308Santhony.gutierrez@amd.com            "name len: %d\n", code_hdr->byteCount, code_hdr->headerByteCount,
45711308Santhony.gutierrez@amd.com            code_hdr->nameLength);
45811308Santhony.gutierrez@amd.com
45911308Santhony.gutierrez@amd.com    // start at offset 4 to skip initial null entry (see Brig spec)
46011308Santhony.gutierrez@amd.com    processDirectives(getCodeSectionEntry(code_hdr->headerByteCount),
46111308Santhony.gutierrez@amd.com                      getCodeSectionEntry(sectionInfo[CodeSectionIndex].size),
46211308Santhony.gutierrez@amd.com                      storageMap);
46311308Santhony.gutierrez@amd.com
46411308Santhony.gutierrez@amd.com    delete[] fileData;
46511308Santhony.gutierrez@amd.com
46611308Santhony.gutierrez@amd.com    DPRINTF(HSALoader, "BRIG object %s loaded.\n", fname);
46711308Santhony.gutierrez@amd.com}
46811308Santhony.gutierrez@amd.com
46911308Santhony.gutierrez@amd.comBrigObject::~BrigObject()
47011308Santhony.gutierrez@amd.com{
47111308Santhony.gutierrez@amd.com    for (int i = 0; i < NumSectionIndices; ++i)
47211308Santhony.gutierrez@amd.com        if (sectionInfo[i].ptr)
47311308Santhony.gutierrez@amd.com            delete[] sectionInfo[i].ptr;
47411308Santhony.gutierrez@amd.com}
475