Files
rocm-systems/rocclr/runtime/device/hsa/hsaprogram.hpp
T
2014-07-04 16:17:05 -04:00

161 líneas
5.5 KiB
C++

//
// Copyright (c) 2008 Advanced Micro Devices, Inc. All rights reserved.
//
#ifndef HSAPROGRAM_HPP_
#define HSAPROGRAM_HPP_
#ifndef WITHOUT_FSA_BACKEND
#include "hsabinary.hpp"
#include "hsacompilerlib.hpp"
#include "services.h"
#include "acl.h"
#include "oclhsa_common.hpp"
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#include "hsadevice.hpp"
//! \namespace oclhsa HSA Device Implementation
namespace oclhsa {
//! \class empty program
class FSAILProgram : public device::Program
{
friend class ClBinary;
public:
//! Default constructor
FSAILProgram(oclhsa::NullDevice& device);
//! Default destructor
~FSAILProgram();
// Initialize Binary for GPU (used only for clCreateProgramWithBinary()).
virtual bool initClBinary(char *binaryIn, size_t size);
//! Returns the aclBinary associated with the progrm
const aclBinary* binaryElf() const {
return static_cast<const aclBinary*>(binaryElf_); }
//! Returns the brig associated with the progrm
const HsaBrig* brig() {
return static_cast<const HsaBrig*>(&brig_); }
const NullDevice& dev() const { return device_; }
//! Returns the hsaBinary associated with the progrm
const HsaDevice* hsaDevice() const {
return dev().getBackendDevice();
}
protected:
//! pre-compile setup for GPU
virtual bool initBuild(amd::option::Options* options);
//! post-compile setup for GPU
virtual bool finiBuild(bool isBuildGood);
/*! \brief Compiles GPU CL program to LLVM binary (compiler frontend)
*
* \return True if we successefully compiled a GPU program
*/
virtual bool compileImpl(
const std::string& sourceCode, //!< the program's source code
const std::vector<const std::string*>& headers,
const char** headerIncludeNames,
amd::option::Options* options //!< compile options's object
);
/*! \brief Compiles LLVM binary to FSAIL code (compiler backend: link+opt+codegen)
*
* \return The build error code
*/
int compileBinaryToFSAIL(
amd::option::Options* options //!< options for compilation
);
virtual bool linkImpl(amd::option::Options* options);
//! Link the device programs.
virtual bool linkImpl (const std::vector<Program*>& inputPrograms,
amd::option::Options* options,
bool createLibrary);
virtual bool createBinary(amd::option::Options* options);
//! Initialize Binary
virtual bool initClBinary();
//! Release the Binary
virtual void releaseClBinary();
virtual const aclTargetInfo & info(const char * str = ""){
return info_;
}
virtual bool isElf(const char* bin) const {
return amd::isElfMagic(bin);
//return false;
}
//! Returns the binary
// This should ensure that the binary is updated with all the kernels
// ClBinary& clBinary() { return binary_; }
ClBinary* clBinary() {
return static_cast<ClBinary*>(device::Program::clBinary());
}
const ClBinary* clBinary() const {
return static_cast<const ClBinary*>(device::Program::clBinary());
}
private:
//! Extracts a symbol from the binaryElf_
// and copies it to a buffer allocated
// by the function
bool ExtractSymbolAndCopy(aclSections id,
const char *symbol_name,
void** address_to_copy,
size_t* symbol_size_bytes,
bool verify);
//! Extracts the aclBinary used internally within the brig
// and pulls the debug and ISA section for a particular kernel
// and inserts it into aclBinary contained in the program
bool updateAclBinaryWithKernelIsaAndDebug(std::string kernelName);
//! Checks the existence of sections in binaryElf_
// and calculates the next stage of compilation;
// if set of the section is impossible, then
// binary is invalid and function returns ACL_TYPE_DEFAULT
aclType getNextCompilationStageFromBinary();
//! Loads the global variables for the BRIG
bool loadBrig();
//! Unloads the global variables for the BRIG
bool unloadBrig();
bool saveBinaryAndSetType(type_t type);
//! Disable default copy constructor
FSAILProgram(const FSAILProgram&);
//! Disable operator=
FSAILProgram& operator=(const FSAILProgram&);
//! Returns all the options to be appended while passing to the
//compiler library
std::string hsailOptions();
std::string openCLSource_; //!< Original OpenCL source
std::string fsailProgram_; //!< FSAIL program after compilation.
std::string llvmBinary_; //!< LLVM IR binary code
//!< aclBinary and aclCompiler - for the compiler libray
aclBinary* binaryElf_; //!<Binary for the new compiler library - shreyas edit
aclBinaryOptions binOpts_; //!<Binary options to create aclBinary
oclhsa::NullDevice& device_; //!< Device related to the program
HsaBrig brig_; //!< Brig for the program
bool isBrigLoaded_; //!< Boolean to verify is the Brig has been loaded
};
/*@}*/} // namespace oclhsa
#endif /*WITHOUT_FSA_BACKEND*/
#endif /* HSAPROGRAM_HPP_*/