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 3411308Santhony.gutierrez@amd.com */ 3511308Santhony.gutierrez@amd.com 3611308Santhony.gutierrez@amd.com#include "gpu-compute/hsail_code.hh" 3711308Santhony.gutierrez@amd.com 3811308Santhony.gutierrez@amd.com#include "arch/gpu_types.hh" 3911308Santhony.gutierrez@amd.com#include "arch/hsail/Brig.h" 4011308Santhony.gutierrez@amd.com#include "arch/hsail/operand.hh" 4111308Santhony.gutierrez@amd.com#include "config/the_gpu_isa.hh" 4211308Santhony.gutierrez@amd.com#include "debug/BRIG.hh" 4311308Santhony.gutierrez@amd.com#include "debug/HSAILObject.hh" 4411308Santhony.gutierrez@amd.com#include "gpu-compute/brig_object.hh" 4511308Santhony.gutierrez@amd.com#include "gpu-compute/gpu_static_inst.hh" 4611308Santhony.gutierrez@amd.com#include "gpu-compute/kernel_cfg.hh" 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.comusing namespace Brig; 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.comint getBrigDataTypeBytes(BrigType16_t t); 5111308Santhony.gutierrez@amd.com 5211308Santhony.gutierrez@amd.comHsailCode::HsailCode(const std::string &name_str) 5311308Santhony.gutierrez@amd.com : HsaCode(name_str), private_size(-1), readonly_size(-1) 5411308Santhony.gutierrez@amd.com{ 5511308Santhony.gutierrez@amd.com} 5611308Santhony.gutierrez@amd.com 5711308Santhony.gutierrez@amd.comvoid 5811308Santhony.gutierrez@amd.comHsailCode::init(const BrigDirectiveExecutable *code_dir, const BrigObject *obj, 5911308Santhony.gutierrez@amd.com StorageMap *objStorageMap) 6011308Santhony.gutierrez@amd.com{ 6111308Santhony.gutierrez@amd.com storageMap = objStorageMap; 6211308Santhony.gutierrez@amd.com 6311308Santhony.gutierrez@amd.com // set pointer so that decoding process can find this kernel context when 6411308Santhony.gutierrez@amd.com // needed 6511308Santhony.gutierrez@amd.com obj->currentCode = this; 6611308Santhony.gutierrez@amd.com 6711308Santhony.gutierrez@amd.com if (code_dir->base.kind != BRIG_KIND_DIRECTIVE_FUNCTION && 6811308Santhony.gutierrez@amd.com code_dir->base.kind != BRIG_KIND_DIRECTIVE_KERNEL) { 6911308Santhony.gutierrez@amd.com fatal("unexpected directive kind %d inside kernel/function init\n", 7011308Santhony.gutierrez@amd.com code_dir->base.kind); 7111308Santhony.gutierrez@amd.com } 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, first code block entry is: %d\n", 7411308Santhony.gutierrez@amd.com code_dir->firstCodeBlockEntry); 7511308Santhony.gutierrez@amd.com 7611308Santhony.gutierrez@amd.com // clear these static vars so we can properly track the max index 7711308Santhony.gutierrez@amd.com // for this kernel 7811308Santhony.gutierrez@amd.com SRegOperand::maxRegIdx = 0; 7911308Santhony.gutierrez@amd.com DRegOperand::maxRegIdx = 0; 8011308Santhony.gutierrez@amd.com CRegOperand::maxRegIdx = 0; 8111308Santhony.gutierrez@amd.com setPrivateSize(0); 8211308Santhony.gutierrez@amd.com 8311308Santhony.gutierrez@amd.com const BrigBase *entryPtr = brigNext((BrigBase*)code_dir); 8411308Santhony.gutierrez@amd.com const BrigBase *endPtr = 8511308Santhony.gutierrez@amd.com obj->getCodeSectionEntry(code_dir->nextModuleEntry); 8611308Santhony.gutierrez@amd.com 8711697Santhony.gutierrez@amd.com // the instruction's byte address (relative to the base addr 8811697Santhony.gutierrez@amd.com // of the code section) 8911697Santhony.gutierrez@amd.com int inst_addr = 0; 9011697Santhony.gutierrez@amd.com // the index that points to the instruction in the instruction 9111697Santhony.gutierrez@amd.com // array 9211308Santhony.gutierrez@amd.com int inst_idx = 0; 9311308Santhony.gutierrez@amd.com std::vector<GPUStaticInst*> instructions; 9411308Santhony.gutierrez@amd.com int funcarg_size_scope = 0; 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com // walk through instructions in code section and directives in 9711308Santhony.gutierrez@amd.com // directive section in parallel, processing directives that apply 9811308Santhony.gutierrez@amd.com // when we reach the relevant code point. 9911308Santhony.gutierrez@amd.com while (entryPtr < endPtr) { 10011308Santhony.gutierrez@amd.com switch (entryPtr->kind) { 10111308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_VARIABLE: 10211308Santhony.gutierrez@amd.com { 10311308Santhony.gutierrez@amd.com const BrigDirectiveVariable *sym = 10411308Santhony.gutierrez@amd.com (const BrigDirectiveVariable*)entryPtr; 10511308Santhony.gutierrez@amd.com 10611308Santhony.gutierrez@amd.com DPRINTF(HSAILObject,"Initializing code, directive is " 10711308Santhony.gutierrez@amd.com "kind_variable, symbol is: %s\n", 10811308Santhony.gutierrez@amd.com obj->getString(sym->name)); 10911308Santhony.gutierrez@amd.com 11011308Santhony.gutierrez@amd.com StorageElement *se = storageMap->addSymbol(sym, obj); 11111308Santhony.gutierrez@amd.com 11211308Santhony.gutierrez@amd.com if (sym->segment == BRIG_SEGMENT_PRIVATE) { 11311308Santhony.gutierrez@amd.com setPrivateSize(se->size); 11411308Santhony.gutierrez@amd.com } else { // spill 11511308Santhony.gutierrez@amd.com funcarg_size_scope += se->size; 11611308Santhony.gutierrez@amd.com } 11711308Santhony.gutierrez@amd.com } 11811308Santhony.gutierrez@amd.com break; 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_LABEL: 12111308Santhony.gutierrez@amd.com { 12211308Santhony.gutierrez@amd.com const BrigDirectiveLabel *lbl = 12311308Santhony.gutierrez@amd.com (const BrigDirectiveLabel*)entryPtr; 12411308Santhony.gutierrez@amd.com 12511308Santhony.gutierrez@amd.com DPRINTF(HSAILObject,"Initializing code, directive is " 12611308Santhony.gutierrez@amd.com "kind_label, label is: %s \n", 12711308Santhony.gutierrez@amd.com obj->getString(lbl->name)); 12811308Santhony.gutierrez@amd.com 12911697Santhony.gutierrez@amd.com labelMap.addLabel(lbl, inst_addr, obj); 13011308Santhony.gutierrez@amd.com } 13111308Santhony.gutierrez@amd.com break; 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_PRAGMA: 13411308Santhony.gutierrez@amd.com { 13511308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, directive " 13611308Santhony.gutierrez@amd.com "is kind_pragma\n"); 13711308Santhony.gutierrez@amd.com } 13811308Santhony.gutierrez@amd.com break; 13911308Santhony.gutierrez@amd.com 14011308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_COMMENT: 14111308Santhony.gutierrez@amd.com { 14211308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, directive is " 14311308Santhony.gutierrez@amd.com "kind_comment\n"); 14411308Santhony.gutierrez@amd.com } 14511308Santhony.gutierrez@amd.com break; 14611308Santhony.gutierrez@amd.com 14711308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_ARG_BLOCK_START: 14811308Santhony.gutierrez@amd.com { 14911308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, directive is " 15011308Santhony.gutierrez@amd.com "kind_arg_block_start\n"); 15111308Santhony.gutierrez@amd.com 15211308Santhony.gutierrez@amd.com storageMap->resetOffset(BRIG_SEGMENT_ARG); 15311308Santhony.gutierrez@amd.com funcarg_size_scope = 0; 15411308Santhony.gutierrez@amd.com } 15511308Santhony.gutierrez@amd.com break; 15611308Santhony.gutierrez@amd.com 15711308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_ARG_BLOCK_END: 15811308Santhony.gutierrez@amd.com { 15911308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, directive is " 16011308Santhony.gutierrez@amd.com "kind_arg_block_end\n"); 16111308Santhony.gutierrez@amd.com 16211308Santhony.gutierrez@amd.com funcarg_size = funcarg_size < funcarg_size_scope ? 16311308Santhony.gutierrez@amd.com funcarg_size_scope : funcarg_size; 16411308Santhony.gutierrez@amd.com } 16511308Santhony.gutierrez@amd.com break; 16611308Santhony.gutierrez@amd.com 16711308Santhony.gutierrez@amd.com case BRIG_KIND_DIRECTIVE_END: 16811308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, dircetive is " 16911308Santhony.gutierrez@amd.com "kind_end\n"); 17011308Santhony.gutierrez@amd.com 17111308Santhony.gutierrez@amd.com break; 17211308Santhony.gutierrez@amd.com 17311308Santhony.gutierrez@amd.com default: 17411308Santhony.gutierrez@amd.com if (entryPtr->kind >= BRIG_KIND_INST_BEGIN && 17511308Santhony.gutierrez@amd.com entryPtr->kind <= BRIG_KIND_INST_END) { 17611308Santhony.gutierrez@amd.com 17711308Santhony.gutierrez@amd.com BrigInstBase *instPtr = (BrigInstBase*)entryPtr; 17811308Santhony.gutierrez@amd.com TheGpuISA::MachInst machInst = { instPtr, obj }; 17911308Santhony.gutierrez@amd.com GPUStaticInst *iptr = decoder.decode(machInst); 18011308Santhony.gutierrez@amd.com 18111308Santhony.gutierrez@amd.com if (iptr) { 18211308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "Initializing code, processing inst " 18311697Santhony.gutierrez@amd.com "byte addr #%d idx %d: OPCODE=%d\n", inst_addr, 18411697Santhony.gutierrez@amd.com inst_idx, instPtr->opcode); 18511308Santhony.gutierrez@amd.com 18611697Santhony.gutierrez@amd.com TheGpuISA::RawMachInst raw_inst = decoder.saveInst(iptr); 18711308Santhony.gutierrez@amd.com iptr->instNum(inst_idx); 18811697Santhony.gutierrez@amd.com iptr->instAddr(inst_addr); 18911697Santhony.gutierrez@amd.com _insts.push_back(raw_inst); 19011308Santhony.gutierrez@amd.com instructions.push_back(iptr); 19111308Santhony.gutierrez@amd.com } 19211697Santhony.gutierrez@amd.com inst_addr += sizeof(TheGpuISA::RawMachInst); 19311308Santhony.gutierrez@amd.com ++inst_idx; 19411308Santhony.gutierrez@amd.com } else if (entryPtr->kind >= BRIG_KIND_OPERAND_BEGIN && 19511308Santhony.gutierrez@amd.com entryPtr->kind < BRIG_KIND_OPERAND_END) { 19611308Santhony.gutierrez@amd.com warn("unexpected operand entry in code segment\n"); 19711308Santhony.gutierrez@amd.com } else { 19811308Santhony.gutierrez@amd.com // there are surely some more cases we will need to handle, 19911308Santhony.gutierrez@amd.com // but we'll deal with them as we find them. 20011308Santhony.gutierrez@amd.com fatal("unexpected directive kind %d inside kernel scope\n", 20111308Santhony.gutierrez@amd.com entryPtr->kind); 20211308Santhony.gutierrez@amd.com } 20311308Santhony.gutierrez@amd.com } 20411308Santhony.gutierrez@amd.com 20511308Santhony.gutierrez@amd.com entryPtr = brigNext(entryPtr); 20611308Santhony.gutierrez@amd.com } 20711308Santhony.gutierrez@amd.com 20811308Santhony.gutierrez@amd.com // compute Control Flow Graph for current kernel 20911308Santhony.gutierrez@amd.com ControlFlowInfo::assignImmediatePostDominators(instructions); 21011308Santhony.gutierrez@amd.com 21111308Santhony.gutierrez@amd.com max_sreg = SRegOperand::maxRegIdx; 21211308Santhony.gutierrez@amd.com max_dreg = DRegOperand::maxRegIdx; 21311308Santhony.gutierrez@amd.com max_creg = CRegOperand::maxRegIdx; 21411308Santhony.gutierrez@amd.com 21511308Santhony.gutierrez@amd.com obj->currentCode = nullptr; 21611308Santhony.gutierrez@amd.com} 21711308Santhony.gutierrez@amd.com 21811308Santhony.gutierrez@amd.comHsailCode::HsailCode(const std::string &name_str, 21911308Santhony.gutierrez@amd.com const BrigDirectiveExecutable *code_dir, 22011308Santhony.gutierrez@amd.com const BrigObject *obj, StorageMap *objStorageMap) 22111308Santhony.gutierrez@amd.com : HsaCode(name_str), private_size(-1), readonly_size(-1) 22211308Santhony.gutierrez@amd.com{ 22311308Santhony.gutierrez@amd.com init(code_dir, obj, objStorageMap); 22411308Santhony.gutierrez@amd.com} 22511308Santhony.gutierrez@amd.com 22611308Santhony.gutierrez@amd.comvoid 22711308Santhony.gutierrez@amd.comLabelMap::addLabel(const Brig::BrigDirectiveLabel *lblDir, int inst_index, 22811308Santhony.gutierrez@amd.com const BrigObject *obj) 22911308Santhony.gutierrez@amd.com{ 23011308Santhony.gutierrez@amd.com std::string lbl_name = obj->getString(lblDir->name); 23111308Santhony.gutierrez@amd.com Label &lbl = map[lbl_name]; 23211308Santhony.gutierrez@amd.com 23311308Santhony.gutierrez@amd.com if (lbl.defined()) { 23411308Santhony.gutierrez@amd.com fatal("Attempt to redefine existing label %s\n", lbl_name); 23511308Santhony.gutierrez@amd.com } 23611308Santhony.gutierrez@amd.com 23711308Santhony.gutierrez@amd.com lbl.define(lbl_name, inst_index); 23811308Santhony.gutierrez@amd.com DPRINTF(HSAILObject, "label %s = %d\n", lbl_name, inst_index); 23911308Santhony.gutierrez@amd.com} 24011308Santhony.gutierrez@amd.com 24111308Santhony.gutierrez@amd.comLabel* 24211308Santhony.gutierrez@amd.comLabelMap::refLabel(const Brig::BrigDirectiveLabel *lblDir, 24311308Santhony.gutierrez@amd.com const BrigObject *obj) 24411308Santhony.gutierrez@amd.com{ 24511308Santhony.gutierrez@amd.com std::string name = obj->getString(lblDir->name); 24611308Santhony.gutierrez@amd.com Label &lbl = map[name]; 24711308Santhony.gutierrez@amd.com lbl.checkName(name); 24811308Santhony.gutierrez@amd.com 24911308Santhony.gutierrez@amd.com return &lbl; 25011308Santhony.gutierrez@amd.com} 25111308Santhony.gutierrez@amd.com 25211308Santhony.gutierrez@amd.comint 25311308Santhony.gutierrez@amd.comgetBrigDataTypeBytes(BrigType16_t t) 25411308Santhony.gutierrez@amd.com{ 25511308Santhony.gutierrez@amd.com switch (t) { 25611308Santhony.gutierrez@amd.com case BRIG_TYPE_S8: 25711308Santhony.gutierrez@amd.com case BRIG_TYPE_U8: 25811308Santhony.gutierrez@amd.com case BRIG_TYPE_B8: 25911308Santhony.gutierrez@amd.com return 1; 26011308Santhony.gutierrez@amd.com 26111308Santhony.gutierrez@amd.com case BRIG_TYPE_S16: 26211308Santhony.gutierrez@amd.com case BRIG_TYPE_U16: 26311308Santhony.gutierrez@amd.com case BRIG_TYPE_B16: 26411308Santhony.gutierrez@amd.com case BRIG_TYPE_F16: 26511308Santhony.gutierrez@amd.com return 2; 26611308Santhony.gutierrez@amd.com 26711308Santhony.gutierrez@amd.com case BRIG_TYPE_S32: 26811308Santhony.gutierrez@amd.com case BRIG_TYPE_U32: 26911308Santhony.gutierrez@amd.com case BRIG_TYPE_B32: 27011308Santhony.gutierrez@amd.com case BRIG_TYPE_F32: 27111308Santhony.gutierrez@amd.com return 4; 27211308Santhony.gutierrez@amd.com 27311308Santhony.gutierrez@amd.com case BRIG_TYPE_S64: 27411308Santhony.gutierrez@amd.com case BRIG_TYPE_U64: 27511308Santhony.gutierrez@amd.com case BRIG_TYPE_B64: 27611308Santhony.gutierrez@amd.com case BRIG_TYPE_F64: 27711308Santhony.gutierrez@amd.com return 8; 27811308Santhony.gutierrez@amd.com 27911308Santhony.gutierrez@amd.com case BRIG_TYPE_B1: 28011308Santhony.gutierrez@amd.com 28111308Santhony.gutierrez@amd.com default: 28211308Santhony.gutierrez@amd.com fatal("unhandled symbol data type %d", t); 28311308Santhony.gutierrez@amd.com return 0; 28411308Santhony.gutierrez@amd.com } 28511308Santhony.gutierrez@amd.com} 28611308Santhony.gutierrez@amd.com 28711308Santhony.gutierrez@amd.comStorageElement* 28811308Santhony.gutierrez@amd.comStorageSpace::addSymbol(const BrigDirectiveVariable *sym, 28911308Santhony.gutierrez@amd.com const BrigObject *obj) 29011308Santhony.gutierrez@amd.com{ 29111308Santhony.gutierrez@amd.com const char *sym_name = obj->getString(sym->name); 29211308Santhony.gutierrez@amd.com uint64_t size = 0; 29311308Santhony.gutierrez@amd.com uint64_t offset = 0; 29411308Santhony.gutierrez@amd.com 29511308Santhony.gutierrez@amd.com if (sym->type & BRIG_TYPE_ARRAY) { 29611308Santhony.gutierrez@amd.com size = getBrigDataTypeBytes(sym->type & ~BRIG_TYPE_ARRAY); 29711308Santhony.gutierrez@amd.com size *= (((uint64_t)sym->dim.hi) << 32 | (uint64_t)sym->dim.lo); 29811308Santhony.gutierrez@amd.com 29911308Santhony.gutierrez@amd.com offset = roundUp(nextOffset, getBrigDataTypeBytes(sym->type & 30011308Santhony.gutierrez@amd.com ~BRIG_TYPE_ARRAY)); 30111308Santhony.gutierrez@amd.com } else { 30211308Santhony.gutierrez@amd.com size = getBrigDataTypeBytes(sym->type); 30311308Santhony.gutierrez@amd.com offset = roundUp(nextOffset, getBrigDataTypeBytes(sym->type)); 30411308Santhony.gutierrez@amd.com } 30511308Santhony.gutierrez@amd.com 30611308Santhony.gutierrez@amd.com nextOffset = offset + size; 30711308Santhony.gutierrez@amd.com 30812603Sgabeblack@google.com DPRINTF(HSAILObject, "Adding SYMBOL %s size %d offset %#x, init: %d\n", 30912603Sgabeblack@google.com sym_name, size, offset, sym->init); 31011308Santhony.gutierrez@amd.com 31111308Santhony.gutierrez@amd.com StorageElement* se = new StorageElement(sym_name, offset, size, sym); 31211308Santhony.gutierrez@amd.com elements.push_back(se); 31311308Santhony.gutierrez@amd.com elements_by_addr.insert(AddrRange(offset, offset + size - 1), se); 31411308Santhony.gutierrez@amd.com elements_by_brigptr[sym] = se; 31511308Santhony.gutierrez@amd.com 31611308Santhony.gutierrez@amd.com return se; 31711308Santhony.gutierrez@amd.com} 31811308Santhony.gutierrez@amd.com 31911308Santhony.gutierrez@amd.comStorageElement* 32011308Santhony.gutierrez@amd.comStorageSpace::findSymbol(std::string name) 32111308Santhony.gutierrez@amd.com{ 32211308Santhony.gutierrez@amd.com for (auto it : elements) { 32311308Santhony.gutierrez@amd.com if (it->name == name) { 32411308Santhony.gutierrez@amd.com return it; 32511308Santhony.gutierrez@amd.com } 32611308Santhony.gutierrez@amd.com } 32711308Santhony.gutierrez@amd.com 32811308Santhony.gutierrez@amd.com return nullptr; 32911308Santhony.gutierrez@amd.com} 33011308Santhony.gutierrez@amd.com 33111308Santhony.gutierrez@amd.comStorageElement* 33211308Santhony.gutierrez@amd.comStorageSpace::findSymbol(uint64_t addr) 33311308Santhony.gutierrez@amd.com{ 33411308Santhony.gutierrez@amd.com assert(elements_by_addr.size() > 0); 33511308Santhony.gutierrez@amd.com 33612888Sbrandon.potter@amd.com auto se = elements_by_addr.contains(addr); 33711308Santhony.gutierrez@amd.com 33811308Santhony.gutierrez@amd.com if (se == elements_by_addr.end()) { 33911308Santhony.gutierrez@amd.com return nullptr; 34011308Santhony.gutierrez@amd.com } else { 34111308Santhony.gutierrez@amd.com return se->second; 34211308Santhony.gutierrez@amd.com } 34311308Santhony.gutierrez@amd.com} 34411308Santhony.gutierrez@amd.com 34511308Santhony.gutierrez@amd.comStorageElement* 34611308Santhony.gutierrez@amd.comStorageSpace::findSymbol(const BrigDirectiveVariable *brigptr) 34711308Santhony.gutierrez@amd.com{ 34811308Santhony.gutierrez@amd.com assert(elements_by_brigptr.size() > 0); 34911308Santhony.gutierrez@amd.com 35011308Santhony.gutierrez@amd.com auto se = elements_by_brigptr.find(brigptr); 35111308Santhony.gutierrez@amd.com 35211308Santhony.gutierrez@amd.com if (se == elements_by_brigptr.end()) { 35311308Santhony.gutierrez@amd.com return nullptr; 35411308Santhony.gutierrez@amd.com } else { 35511308Santhony.gutierrez@amd.com return se->second; 35611308Santhony.gutierrez@amd.com } 35711308Santhony.gutierrez@amd.com} 35811308Santhony.gutierrez@amd.com 35911308Santhony.gutierrez@amd.comStorageMap::StorageMap(StorageMap *outerScope) 36011308Santhony.gutierrez@amd.com : outerScopeMap(outerScope) 36111308Santhony.gutierrez@amd.com{ 36211308Santhony.gutierrez@amd.com for (int i = 0; i < NumSegments; ++i) 36311308Santhony.gutierrez@amd.com space[i] = new StorageSpace((BrigSegment)i); 36411308Santhony.gutierrez@amd.com} 36511308Santhony.gutierrez@amd.com 36611308Santhony.gutierrez@amd.comStorageElement* 36711308Santhony.gutierrez@amd.comStorageMap::addSymbol(const BrigDirectiveVariable *sym, const BrigObject *obj) 36811308Santhony.gutierrez@amd.com{ 36911308Santhony.gutierrez@amd.com BrigSegment8_t segment = sym->segment; 37011308Santhony.gutierrez@amd.com 37111308Santhony.gutierrez@amd.com assert(segment >= Brig::BRIG_SEGMENT_FLAT); 37211308Santhony.gutierrez@amd.com assert(segment < NumSegments); 37311308Santhony.gutierrez@amd.com 37411308Santhony.gutierrez@amd.com return space[segment]->addSymbol(sym, obj); 37511308Santhony.gutierrez@amd.com} 37611308Santhony.gutierrez@amd.com 37711308Santhony.gutierrez@amd.comint 37811308Santhony.gutierrez@amd.comStorageMap::getSize(Brig::BrigSegment segment) 37911308Santhony.gutierrez@amd.com{ 38011308Santhony.gutierrez@amd.com assert(segment > Brig::BRIG_SEGMENT_GLOBAL); 38111308Santhony.gutierrez@amd.com assert(segment < NumSegments); 38211308Santhony.gutierrez@amd.com 38311308Santhony.gutierrez@amd.com if (segment != Brig::BRIG_SEGMENT_GROUP && 38411308Santhony.gutierrez@amd.com segment != Brig::BRIG_SEGMENT_READONLY) { 38511308Santhony.gutierrez@amd.com return space[segment]->getSize(); 38611308Santhony.gutierrez@amd.com } else { 38711308Santhony.gutierrez@amd.com int ret = space[segment]->getSize(); 38811308Santhony.gutierrez@amd.com 38911308Santhony.gutierrez@amd.com if (outerScopeMap) { 39011308Santhony.gutierrez@amd.com ret += outerScopeMap->getSize(segment); 39111308Santhony.gutierrez@amd.com } 39211308Santhony.gutierrez@amd.com 39311308Santhony.gutierrez@amd.com return ret; 39411308Santhony.gutierrez@amd.com } 39511308Santhony.gutierrez@amd.com} 39611308Santhony.gutierrez@amd.com 39711308Santhony.gutierrez@amd.comvoid 39811308Santhony.gutierrez@amd.comStorageMap::resetOffset(Brig::BrigSegment segment) 39911308Santhony.gutierrez@amd.com{ 40011308Santhony.gutierrez@amd.com space[segment]->resetOffset(); 40111308Santhony.gutierrez@amd.com} 40211308Santhony.gutierrez@amd.com 40311308Santhony.gutierrez@amd.comStorageElement* 40411308Santhony.gutierrez@amd.comStorageMap::findSymbol(BrigSegment segment, std::string name) 40511308Santhony.gutierrez@amd.com{ 40611308Santhony.gutierrez@amd.com StorageElement *se = space[segment]->findSymbol(name); 40711308Santhony.gutierrez@amd.com 40811308Santhony.gutierrez@amd.com if (se) 40911308Santhony.gutierrez@amd.com return se; 41011308Santhony.gutierrez@amd.com 41111308Santhony.gutierrez@amd.com if (outerScopeMap) 41211308Santhony.gutierrez@amd.com return outerScopeMap->findSymbol(segment, name); 41311308Santhony.gutierrez@amd.com 41411308Santhony.gutierrez@amd.com return nullptr; 41511308Santhony.gutierrez@amd.com} 41611308Santhony.gutierrez@amd.com 41711308Santhony.gutierrez@amd.comStorageElement* 41811308Santhony.gutierrez@amd.comStorageMap::findSymbol(Brig::BrigSegment segment, uint64_t addr) 41911308Santhony.gutierrez@amd.com{ 42011308Santhony.gutierrez@amd.com StorageSpace *sp = space[segment]; 42111308Santhony.gutierrez@amd.com 42211308Santhony.gutierrez@amd.com if (!sp) { 42311308Santhony.gutierrez@amd.com // there is no memory in segment? 42411308Santhony.gutierrez@amd.com return nullptr; 42511308Santhony.gutierrez@amd.com } 42611308Santhony.gutierrez@amd.com 42711308Santhony.gutierrez@amd.com StorageElement *se = sp->findSymbol(addr); 42811308Santhony.gutierrez@amd.com 42911308Santhony.gutierrez@amd.com if (se) 43011308Santhony.gutierrez@amd.com return se; 43111308Santhony.gutierrez@amd.com 43211308Santhony.gutierrez@amd.com if (outerScopeMap) 43311308Santhony.gutierrez@amd.com return outerScopeMap->findSymbol(segment, addr); 43411308Santhony.gutierrez@amd.com 43511308Santhony.gutierrez@amd.com return nullptr; 43611308Santhony.gutierrez@amd.com 43711308Santhony.gutierrez@amd.com} 43811308Santhony.gutierrez@amd.com 43911308Santhony.gutierrez@amd.comStorageElement* 44011308Santhony.gutierrez@amd.comStorageMap::findSymbol(Brig::BrigSegment segment, 44111308Santhony.gutierrez@amd.com const BrigDirectiveVariable *brigptr) 44211308Santhony.gutierrez@amd.com{ 44311308Santhony.gutierrez@amd.com StorageSpace *sp = space[segment]; 44411308Santhony.gutierrez@amd.com 44511308Santhony.gutierrez@amd.com if (!sp) { 44611308Santhony.gutierrez@amd.com // there is no memory in segment? 44711308Santhony.gutierrez@amd.com return nullptr; 44811308Santhony.gutierrez@amd.com } 44911308Santhony.gutierrez@amd.com 45011308Santhony.gutierrez@amd.com StorageElement *se = sp->findSymbol(brigptr); 45111308Santhony.gutierrez@amd.com 45211308Santhony.gutierrez@amd.com if (se) 45311308Santhony.gutierrez@amd.com return se; 45411308Santhony.gutierrez@amd.com 45511308Santhony.gutierrez@amd.com if (outerScopeMap) 45611308Santhony.gutierrez@amd.com return outerScopeMap->findSymbol(segment, brigptr); 45711308Santhony.gutierrez@amd.com 45811308Santhony.gutierrez@amd.com return nullptr; 45911308Santhony.gutierrez@amd.com 46011308Santhony.gutierrez@amd.com} 461