brig_object.hh 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#ifndef __BRIG_OBJECT_HH__ 3711308Santhony.gutierrez@amd.com#define __BRIG_OBJECT_HH__ 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.com#include <cassert> 4011308Santhony.gutierrez@amd.com#include <cstdint> 4111308Santhony.gutierrez@amd.com#include <string> 4211308Santhony.gutierrez@amd.com#include <vector> 4311308Santhony.gutierrez@amd.com 4411308Santhony.gutierrez@amd.com#include "arch/hsail/Brig.h" 4511308Santhony.gutierrez@amd.com#include "gpu-compute/hsa_object.hh" 4611308Santhony.gutierrez@amd.com#include "gpu-compute/hsail_code.hh" 4711308Santhony.gutierrez@amd.com 4811308Santhony.gutierrez@amd.comclass LabelMap; 4911308Santhony.gutierrez@amd.comclass StorageMap; 5011308Santhony.gutierrez@amd.com 5111308Santhony.gutierrez@amd.com/* @class BrigObject 5211308Santhony.gutierrez@amd.com * this class implements the BRIG loader object, and 5311308Santhony.gutierrez@amd.com * is used when the simulator directly executes HSAIL. 5411308Santhony.gutierrez@amd.com * this class is responsible for extracting all 5511308Santhony.gutierrez@amd.com * information about kernels contained in BRIG format 5611308Santhony.gutierrez@amd.com * and converts them to HsailCode objects that are 5711308Santhony.gutierrez@amd.com * usable by the simulator and emulated runtime. 5811308Santhony.gutierrez@amd.com */ 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.comclass BrigObject final : public HsaObject 6111308Santhony.gutierrez@amd.com{ 6211308Santhony.gutierrez@amd.com public: 6311308Santhony.gutierrez@amd.com enum SectionIndex 6411308Santhony.gutierrez@amd.com { 6511308Santhony.gutierrez@amd.com DataSectionIndex, 6611308Santhony.gutierrez@amd.com CodeSectionIndex, 6711308Santhony.gutierrez@amd.com OperandsSectionIndex, 6811308Santhony.gutierrez@amd.com NumSectionIndices 6911308Santhony.gutierrez@amd.com }; 7011308Santhony.gutierrez@amd.com 7111308Santhony.gutierrez@amd.com static const char *sectionNames[]; 7211308Santhony.gutierrez@amd.com 7311308Santhony.gutierrez@amd.com struct SectionInfo 7411308Santhony.gutierrez@amd.com { 7511308Santhony.gutierrez@amd.com uint8_t *ptr; 7611308Santhony.gutierrez@amd.com int size; 7711308Santhony.gutierrez@amd.com }; 7811308Santhony.gutierrez@amd.com 7911308Santhony.gutierrez@amd.com static HsaObject* tryFile(const std::string &fname, int len, 8011308Santhony.gutierrez@amd.com uint8_t *fileData); 8111308Santhony.gutierrez@amd.com 8211308Santhony.gutierrez@amd.com SectionInfo sectionInfo[NumSectionIndices]; 8311308Santhony.gutierrez@amd.com const uint8_t *getSectionOffset(enum SectionIndex sec, int offs) const; 8411308Santhony.gutierrez@amd.com 8511308Santhony.gutierrez@amd.com std::vector<HsailCode*> kernels; 8611308Santhony.gutierrez@amd.com std::vector<HsailCode*> functions; 8711308Santhony.gutierrez@amd.com std::string kern_block_name; 8811308Santhony.gutierrez@amd.com 8911308Santhony.gutierrez@amd.com void processDirectives(const Brig::BrigBase *dirPtr, 9011308Santhony.gutierrez@amd.com const Brig::BrigBase *endPtr, 9111308Santhony.gutierrez@amd.com StorageMap *storageMap); 9211308Santhony.gutierrez@amd.com 9311308Santhony.gutierrez@amd.com BrigObject(const std::string &fname, int len, uint8_t *fileData); 9411308Santhony.gutierrez@amd.com ~BrigObject(); 9511308Santhony.gutierrez@amd.com 9611308Santhony.gutierrez@amd.com // eventually these will need to be per-kernel not per-object-file 9711308Santhony.gutierrez@amd.com StorageMap *storageMap; 9811308Santhony.gutierrez@amd.com LabelMap *labelMap; 9911308Santhony.gutierrez@amd.com 10011308Santhony.gutierrez@amd.com const char* getString(int offs) const; 10111308Santhony.gutierrez@amd.com const Brig::BrigData* getBrigBaseData(int offs) const; 10211308Santhony.gutierrez@amd.com const uint8_t* getData(int offs) const; 10311308Santhony.gutierrez@amd.com const Brig::BrigBase* getCodeSectionEntry(int offs) const; 10411308Santhony.gutierrez@amd.com const Brig::BrigOperand* getOperand(int offs) const; 10511308Santhony.gutierrez@amd.com unsigned getOperandPtr(int offs, int index) const; 10611308Santhony.gutierrez@amd.com const Brig::BrigInstBase* getInst(int offs) const; 10711308Santhony.gutierrez@amd.com 10811308Santhony.gutierrez@amd.com HsaCode* getKernel(const std::string &name) const override; 10911308Santhony.gutierrez@amd.com HsaCode* getFunction(const std::string &name) const override; 11011308Santhony.gutierrez@amd.com 11111308Santhony.gutierrez@amd.com int numKernels() const override { return kernels.size(); } 11211308Santhony.gutierrez@amd.com 11311308Santhony.gutierrez@amd.com HsaCode* getKernel(int i) const override { return kernels[i]; } 11411308Santhony.gutierrez@amd.com 11511308Santhony.gutierrez@amd.com // pointer to the current kernel/function we're processing, so elements 11611308Santhony.gutierrez@amd.com // under construction can reference it. kinda ugly, but easier 11711308Santhony.gutierrez@amd.com // than passing it all over for the few places it's needed. 11811308Santhony.gutierrez@amd.com mutable HsailCode *currentCode; 11911308Santhony.gutierrez@amd.com}; 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com// Utility function to bump Brig item pointer to next element given 12211308Santhony.gutierrez@amd.com// item size in bytes. Really just an add but with lots of casting. 12311308Santhony.gutierrez@amd.comtemplate<typename T> 12411308Santhony.gutierrez@amd.comT* 12511308Santhony.gutierrez@amd.combrigNext(T *ptr) 12611308Santhony.gutierrez@amd.com{ 12711308Santhony.gutierrez@amd.com Brig::BrigBase *base_ptr = (Brig::BrigBase*)ptr; 12811308Santhony.gutierrez@amd.com int size = base_ptr->byteCount; 12911308Santhony.gutierrez@amd.com assert(size); 13011308Santhony.gutierrez@amd.com 13111308Santhony.gutierrez@amd.com return (T*)((uint8_t*)ptr + size); 13211308Santhony.gutierrez@amd.com} 13311308Santhony.gutierrez@amd.com 13411308Santhony.gutierrez@amd.com#endif // __BRIG_OBJECT_HH__ 135