//
// Copyright (c) 2012 Advanced Micro Devices, Inc. All rights reserved.
//
#ifndef _ACL_FUNCTORS_0_8_H_
#define _ACL_FUNCTORS_0_8_H_

//! Callback for the log function function pointer that many
// API calls take to have the calling application receive
// information on what errors occur.
typedef void (*aclLogFunction_0_8)(const char *msg, size_t size);

typedef bool (*aclJITSymbolCallback)(const char*, const void*, void*);
typedef void* aclJITObjectImage;
typedef const void* constAclJITObjectImage;

typedef acl_error
(ACL_API_ENTRY *InsertSec_0_8)(aclCompiler *cl,
    aclBinary *binary,
    const void *data,
    size_t data_size,
    aclSections id) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *InsertSym_0_8)(aclCompiler *cl,
    aclBinary *binary,
    const void *data,
    size_t data_size,
    aclSections id,
    const char *symbol) ACL_API_0_8;

typedef const void *
(ACL_API_ENTRY *ExtractSec_0_8)(aclCompiler *cl,
    const aclBinary *binary,
    size_t *size,
    aclSections id,
    acl_error *error_code) ACL_API_0_8;

typedef const void *
(ACL_API_ENTRY *ExtractSym_0_8)(aclCompiler *cl,
    const aclBinary *binary,
    size_t *size,
    aclSections id,
    const char *symbol,
    acl_error *error_code) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *RemoveSec_0_8)(aclCompiler *cl,
    aclBinary *binary,
    aclSections id) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *RemoveSym_0_8)(aclCompiler *cl,
    aclBinary *binary,
    aclSections id,
    const char *symbol) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *QueryInfo_0_8)(aclCompiler *cl,
    const aclBinary *binary,
    aclQueryType query,
    const char *kernel,
    void *data_ptr,
    size_t *ptr_size) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *AddDbgArg_0_8)(aclCompiler *cl,
    aclBinary *bin,
    const char *kernel,
    const char *name,
    bool byVal) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *RemoveDbgArg_0_8)(aclCompiler *cl,
    aclBinary *bin,
    const char *kernel,
    const char *name) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *Compile_0_8)(aclCompiler *cl,
    aclBinary *bin,
    const char *options,
    aclType from,
    aclType to,
    aclLogFunction_0_8 compile_callback) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *Link_0_8)(aclCompiler *cl,
    aclBinary *src_bin,
    unsigned int num_libs,
    aclBinary **libs,
    aclType link_mode,
    const char *options,
    aclLogFunction_0_8 link_callback) ACL_API_0_8;

typedef const char *
(ACL_API_ENTRY *CompLog_0_8)(aclCompiler *cl) ACL_API_0_8;

typedef const void *
(ACL_API_ENTRY *RetrieveType_0_8)(aclCompiler *cl,
    const aclBinary *bin,
    const char *name,
    size_t *data_size,
    aclType type,
    acl_error *error_code) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *SetType_0_8)(aclCompiler *cl,
    aclBinary *bin,
    const char *name,
    aclType type,
    const void *data,
    size_t size) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *ConvertType_0_8)(aclCompiler *cl,
    aclBinary *bin,
    const char *name,
    aclType type) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *Disassemble_0_8)(aclCompiler *cl,
    aclBinary *bin,
    const char *kernel,
    aclLogFunction_0_8 disasm_callback) ACL_API_0_8;

typedef const void *
(ACL_API_ENTRY *GetDevBinary_0_8)(aclCompiler *cl,
    const aclBinary *bin,
    const char *kernel,
    size_t *size,
    acl_error *error_code) ACL_API_0_8;

typedef aclLoaderData *
(ACL_API_ENTRY *LoaderInit_0_8)(aclCompiler *cl,
    aclBinary *bin,
    aclLogFunction_0_8 callback,
    acl_error *error);

typedef acl_error
(ACL_API_ENTRY *LoaderFini_0_8)(aclLoaderData *data);

typedef aclModule *
(ACL_API_ENTRY *FEToIR_0_8)(aclLoaderData *ald,
    const char *source,
    size_t data_size,
    aclContext *ctx,
    acl_error *error) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *SourceToISA_0_8)(aclLoaderData *ald,
    const char *source,
    size_t data_size) ACL_API_0_8;

typedef aclModule *
(ACL_API_ENTRY *IRPhase_0_8)(aclLoaderData *data,
    aclModule *ir,
    aclContext *ctx,
    acl_error *error) ACL_API_0_8;

typedef aclModule *
(ACL_API_ENTRY *LinkPhase_0_8)(aclLoaderData *data,
    aclModule *ir,
    unsigned int num_libs,
    aclModule **libs,
    aclContext *ctx,
    acl_error *error) ACL_API_0_8;

typedef const void *
(ACL_API_ENTRY *CGPhase_0_8)(aclLoaderData *data,
    aclModule *ir,
    aclContext *ctx,
    acl_error *error) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *DisasmISA_0_8)(aclLoaderData *data,
    const char *kernel,
    const void *isa_code,
    size_t isa_size) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *SetupLoaderObject_0_8)(aclCompiler *cl) ACL_API_0_8;

typedef aclJITObjectImage
(ACL_API_ENTRY *JITObjectImageCreate_0_8)(const void* buffer,
    size_t length,
    aclBinary* bin,
    acl_error* error_code) ACL_API_0_8;

typedef aclJITObjectImage
(ACL_API_ENTRY *JITObjectImageCopy_0_8)(const void* buffer,
    size_t length,
    acl_error* error_code) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *JITObjectImageDestroy_0_8)(aclJITObjectImage image) ACL_API_0_8;

typedef size_t
(ACL_API_ENTRY *JITObjectImageSize_0_8)(aclJITObjectImage image,
    acl_error* error_code) ACL_API_0_8;

typedef const char *
(ACL_API_ENTRY *JITObjectImageData_0_8)(aclJITObjectImage image,
    acl_error* error_code) ACL_API_0_8;

typedef acl_error
(ACL_API_ENTRY *JITObjectImageFinalize_0_8)(aclJITObjectImage image) ACL_API_0_8;

typedef size_t
(ACL_API_ENTRY *JITObjectImageGetGlobalsSize_0_8)(aclJITObjectImage image,
    acl_error* error_code) ACL_API_0_8;

typedef bool (*JITSymbolCallback_0_8)(const char*, const void*, void*);

typedef acl_error
(ACL_API_ENTRY *JITObjectImageIterateSymbols_0_8)(aclJITObjectImage image,
    JITSymbolCallback_0_8 jit_callback,
    void* data) ACL_API_0_8;

typedef char*
(ACL_API_ENTRY *JITObjectImageDisassembleKernel_0_8)(constAclJITObjectImage image,
    const char* kernel,
    acl_error* error_code) ACL_API_0_8;

typedef void*
(*AllocFunc_0_8)(size_t size) ACL_API_0_8;

typedef void
(*FreeFunc_0_8)(void *ptr) ACL_API_0_8;

#endif // _ACL_FUNCTORS_0_8_H_
