/*
 * Copyright 2010-2016 Intel Corporation.
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, version 2.1.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 *
 * Disclaimer: The codes contained in these modules may be specific
 * to the Intel Software Development Platform codenamed Knights Ferry,
 * and the Intel product codenamed Knights Corner, and are not backward
 * compatible with other Intel products. Additionally, Intel will NOT
 * support the codes or instruction set in future products.
 *
 * Intel offers no warranty of any kind regarding the code. This code is
 * licensed on an "AS IS" basis and Intel is not obligated to provide
 * any support, assistance, installation, training, or other services
 * of any kind. Intel is also not obligated to provide any updates,
 * enhancements or extensions. Intel specifically disclaims any warranty
 * of merchantability, non-infringement, fitness for any particular
 * purpose, and any other warranty.
 *
 * Further, Intel disclaims all liability of any kind, including but
 * not limited to liability for infringement of any proprietary rights,
 * relating to the use of the code, even if Intel is notified of the
 * possibility of such liability. Except as expressly stated in an Intel
 * license agreement provided with this code and agreed upon with Intel,
 * no license, express or implied, by estoppel or otherwise, to any
 * intellectual property rights is granted herein.
 */

/***
* See http://sourceware.org/binutils/docs/ld/VERSION.html#VERSION for more info.
* Use this in conjunction with coi_version_asm.h.
* // Comments don't work in this file.
***/

COI_1.0
{
  global:
    COIBufferAddRef;
    COIBufferCopy;
    COIBufferCreate;
    COIBufferCreateFromMemory;
    COIBufferDestroy;
    COIBufferGetSinkAddress;
    COIBufferMap;
    COIBufferRead;
    COIBufferReleaseRef;
    COIBufferSetState;
    COIBufferUnmap;
    COIBufferWrite;
    COIEngineGetCount;
    COIEngineGetHandle;
    COIEngineGetIndex;
    COIEngineGetInfo;
    COIEventWait;
    COIEventRegisterCallback;
    COIPerfGetCycleFrequency;
    COIPipelineClearCPUMask;
    COIPipelineCreate;
    COIPipelineDestroy;
    COIPipelineRunFunction;
    COIPipelineSetCPUMask;
    COIPipelineStartExecutingRunFunctions;
    COIProcessCreateFromFile;
    COIProcessCreateFromMemory;
    COIProcessDestroy;
    COIProcessGetFunctionHandles;
    COIProcessLoadLibraryFromMemory;
    COIProcessRegisterLibraries;
    COIProcessUnloadLibrary;
    COIProcessWaitForShutdown;
  local:
    *;
};

COI_2.0
{

} COI_1.0;

