<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook MathML Module V1.1b1//EN"
              "http://www.oasis-open.org/docbook/xml/mathml/1.1CR1/dbmathml.dtd">

<refentry>
    <refentryinfo>
        <keywordset>
            <keyword>clGetProgramBuildInfo</keyword>
        </keywordset>
    </refentryinfo>

    <refmeta>
        <refentrytitle>
            clGetProgramBuildInfo
        </refentrytitle>

        <refmiscinfo>
            <copyright>
                <year>2007-2013</year>
                <holder>The Khronos Group Inc.
 Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and/or associated documentation files (the
"Materials"), to deal in the Materials without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Materials, and to
permit persons to whom the Materials are furnished to do so, subject to
the condition that this copyright notice and permission notice shall be included
in all copies or substantial portions of the Materials.</holder>
            </copyright>
        </refmiscinfo>
        <manvolnum>3</manvolnum>
    </refmeta>

<!-- ================================ SYNOPSIS -->

    <refnamediv id="clGetProgramBuildInfo">
        <refname>
            clGetProgramBuildInfo
        </refname>

        <refpurpose>
            Returns build information for each device in the program object.
        </refpurpose>
    </refnamediv>

    <refsynopsisdiv xmlns:xlink="http://www.w3.org/1999/xlink"><title></title>
        <funcsynopsis>
            <funcprototype>
                <funcdef>
                    <link xlink:href="scalarDataTypes.html">cl_int</link>
 <function>clGetProgramBuildInfo</function>
                </funcdef>

                <paramdef><link xlink:href="abstractDataTypes.html">cl_program</link> <parameter>program</parameter></paramdef>,
                <paramdef><link xlink:href="abstractDataTypes.html">cl_device_id</link> <parameter>device</parameter></paramdef>,
                <paramdef><link xlink:href="enums.html#cl_program_build_info">cl_program_build_info</link> <parameter>param_name</parameter></paramdef>,
                <paramdef><link xlink:href="scalarDataTypes.html">size_t</link> <parameter>param_value_size</parameter></paramdef>,
                <paramdef><link xlink:href="scalarDataTypes.html">void</link> <parameter>*param_value</parameter></paramdef>,
                <paramdef><link xlink:href="scalarDataTypes.html">size_t</link> <parameter>*param_value_size_ret</parameter></paramdef>

            </funcprototype>
        </funcsynopsis>
    </refsynopsisdiv>

<!-- ================================ PARAMETERS -->

    <refsect1 id="parameters">
        <title>Parameters</title>
        <variablelist>

            <varlistentry>
                <term><varname>program</varname></term>
                <listitem><para> Specifies the program object being queried.</para></listitem>
            </varlistentry>

            <varlistentry>
                <term><varname>device</varname></term>
                <listitem><para>
                    Specifies the device for which build information is being queried.
                    <varname>device</varname> must be a valid device associated with <varname>program</varname>.
                </para></listitem>
            </varlistentry>

            <varlistentry>
                <term><varname>
                        param_name
                </varname></term>

                <listitem>
                    <para>
                      Specifies the information to query. The list of supported
                      <varname>param_name</varname> types and the information returned in
                      <varname>param_value</varname> by <function>clGetProgramBuildInfo</function>
                      is described in the table below.
                    </para>

                    <!-- table 5.17 -->
                    <informaltable frame="all">
                        <tgroup cols="2" align="left" colsep="1" rowsep="1">
                            <colspec colname="col1" colnum="1" />
                            <colspec colname="col2" colnum="2" />
                            <thead>
                                <row>
                                    <entry>cl_program_build_info</entry>
                                    <entry>Return Type and Info. returned in <varname>param_value</varname></entry>
                                </row>
                            </thead>

                            <tbody>
                                <row>
                                    <entry><constant>CL_PROGRAM_BUILD_STATUS</constant></entry>
                                    <entry>
                                        Return type: cl_build_status

                                        <para>
                                          Returns the build, compile or link status, whichever was
                                          performed last on <varname>program</varname> for <varname>device</varname>.
                                        </para>

                                        <para>
                                            This can be one of the following:
                                        </para>

                                        <para>
                                          <errorname><constant>CL_BUILD_NONE</constant></errorname>.
                                          The build status returned if no
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>,
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          or
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>
                                          has been performed on the specified program object
                                          for <varname>device</varname>.
                                        </para>

                                        <para>
                                          <errorname><constant>CL_BUILD_ERROR</constant></errorname>.
                                          The build status returned if
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>,
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          or
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>
                                          whichever was performed last on the specified program
                                          object for <varname>device</varname> generated an error.
                                        </para>

                                        <para>
                                          <errorname><constant>CL_BUILD_SUCCESS</constant></errorname>.
                                          The build status returned if
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>,
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          or
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>
                                          whichever was performed last on the specified program
                                          object for <varname>device</varname> was successful.
                                        </para>

                                        <para>
                                          <errorname><constant>CL_BUILD_IN_PROGRESS</constant></errorname>.
                                          The build status returned if
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>,
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          or
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>
                                          whichever was performed last on the specified program
                                          object for <varname>device</varname> has not finished.
                                        </para>
                                    </entry>
                                </row>

                                <row>
                                 <entry><errorname><constant>CL_PROGRAM_BUILD_OPTIONS</constant></errorname></entry>
                                    <entry>
                                        Return type: char[]

                                        <para>
                                          Return the build, compile or link
                                          options specified by the <varname>options</varname> argument in
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>,
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          or
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>,
                                          whichever was performed last on <varname>program</varname> for
                                          <varname>device</varname>.
                                        </para>

                                        <para>
                                          If build status of <varname>program</varname>
                                          for <varname>device</varname> is
                                          <constant>CL_BUILD_NONE</constant>, an empty string
                                          is returned.
                                        </para>
                                    </entry>
                                </row>

                                <row>
                                    <entry><errorname><constant>CL_PROGRAM_BUILD_LOG</constant></errorname></entry>
                                    <entry>
                                        Return type: char[]

                                        <para>
                                          Return the build, compile or link log for
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry> or
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          whichever was performed last on <varname>program</varname> for
                                          <varname>device</varname>.
                                        </para>

                                        <para>
                                          If build status of <varname>program</varname> for <varname>device</varname> is
                                          <constant>CL_BUILD_NONE</constant>, an empty string
                                          is returned.
                                        </para>
                                    </entry>
                                </row>

                                 <row>
                                    <entry><errorname><constant>CL_PROGRAM_BINARY_TYPE</constant></errorname></entry>
                                    <entry>
                                        Return type: cl_program_binary_type

                                        <para>
                                          Return the program binary type for
                                          <varname>device</varname>. This can be one of the
                                          following values:
                                        </para>

                                        <para>
                                          <constant>CL_PROGRAM_BINARY_TYPE_NONE</constant>. There
                                          is no binary associated with <varname>device</varname>.
                                        </para>

                                        <para>
                                          <constant>CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT</constant>.
                                          A compiled binary is associated
                                          with <varname>device</varname>.
                                          This is the case if <varname>program</varname> was created using
                                          <citerefentry><refentrytitle>clCreateProgramWithSource</refentrytitle></citerefentry>
                                          and compiled using
                                          <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>
                                          or a compiled binary is loaded using
                                          <citerefentry><refentrytitle>clCreateProgramWithBinary</refentrytitle></citerefentry>.
                                        </para>

                                        <para>
                                          <constant>CL_PROGRAM_BINARY_TYPE_LIBRARY</constant>. A
                                          library binary is associated
                                          with <varname>device</varname>.
                                          This is the case if <varname>program</varname> was created by
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>
                                          which is called with the <code>–create-library</code> link
                                          option or if a library binary is loaded using
                                          <citerefentry><refentrytitle>clCreateProgramWithBinary</refentrytitle></citerefentry>.
                                        </para>

                                        <para>
                                          <constant>CL_PROGRAM_BINARY_TYPE_EXECUTABLE</constant>.
                                          An executable binary is associated
                                          with <varname>device</varname>.
                                          This is the case if <varname>program</varname> was created by
                                          <citerefentry><refentrytitle>clLinkProgram</refentrytitle></citerefentry>
                                          without the <code>–create-library</code>
                                          link option or program was created by
                                          <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>
                                          or an executable binary is loaded using
                                          <citerefentry><refentrytitle>clCreateProgramWithBinary</refentrytitle></citerefentry>.
                                        </para>

                                        <para>
                                            <constant>CL_PROGRAM_BINARY_TYPE_INTERMEDIATE</constant>.
                                            (Applies if extension 
                                            <citerefentry><refentrytitle>cl_khr_spir</refentrytitle></citerefentry> 
                                            is enabled.)
                                            An intermediate (non-source) representation for 
                                            the program is loaded as a binary. The program 
                                            must be further processed with 
                                            <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry> 
                                            or <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>. 
                                            If processed with 
                                            <citerefentry><refentrytitle>clCompileProgram</refentrytitle></citerefentry>, 
                                            the result 
                                            will be a binary of type
                                            <constant>CL_PROGRAM_BINARY_TYPE_COMPILED_OBJECT</constant> or 
                                            <constant>CL_PROGRAM_BINARY_TYPE_LIBRARY</constant>. If
                                            processed with 
                                            <citerefentry><refentrytitle>clBuildProgram</refentrytitle></citerefentry>, 
                                            the result will be 
                                            a binary of type <constant>CL_PROGRAM_BINARY_TYPE_EXECUTABLE</constant>.
                                        </para>

                                    </entry>
                                </row>

                                <row>
                                    <entry><errorname><constant>CL_PROGRAM_BUILD_GLOBAL_-
VARIABLE_TOTAL_SIZE</constant></errorname></entry>
                                    <entry>
                                        Return type: size_t

                                        <para>
                                            The total amount of storage, in bytes, used by 
                                            program variables in the global address space. 
                                        </para>
                                    </entry>
                                </row>

                            </tbody>
                        </tgroup>
                    </informaltable>
               </listitem>
            </varlistentry>

            <varlistentry>
                <term><varname>param_value</varname></term>
                <listitem><para>
                    A pointer to memory where the appropriate result being queried is returned.
                    If <varname>param_value</varname> is NULL, it is ignored.
                </para></listitem>
            </varlistentry>

            <varlistentry>
                <term><varname>param_value_size</varname></term>
                <listitem><para>
                    Specifies the size in bytes of memory pointed to by <varname>param_value</varname>. This size
                    must be &ge; size of return type as described in the table above.
                </para></listitem>
            </varlistentry>

            <varlistentry>
                <term><varname>param_value_size_ret</varname></term>
                <listitem><para>
                    Returns the actual size in bytes of data copied to <varname>param_value</varname>.
                    If <varname>param_value_size_ret</varname> is NULL, it is ignored.
                </para></listitem>
            </varlistentry>
        </variablelist>
    </refsect1>

<!-- ================================ NOTES  -->

  <refsect1 id="notes"><title>Notes</title>
        <para>
          A program binary (compiled binary, library binary or executable binary) built for a
          parent device can be used by all its sub-devices. If a program binary has not been built
          for a sub-device, the program binary associated with the parent device will be used.
        </para>

        <para>
          A program binary for a device specified with
          <citerefentry><refentrytitle>clCreateProgramWithBinary</refentrytitle></citerefentry>
          or queried using
          <citerefentry><refentrytitle>clGetProgramInfo</refentrytitle></citerefentry> can be
          used as the binary for the associated root device, and all sub-devices created from
          the root-level device or sub-devices thereof.
        </para>
    </refsect1>

<!-- ================================ ERRORS  -->

    <refsect1 id="errors"><title>Errors</title>
        <para>
          Returns <errorname>CL_SUCCESS</errorname> if the function is executed successfully.
          Otherwise it returns the following:
        </para>

        <itemizedlist mark="disc">
            <listitem>
              Returns <errorname>CL_INVALID_DEVICE</errorname> if <varname>device</varname>
              is not in the list of devices associated with <varname>program</varname>.
            </listitem>

            <listitem>
              Returns <errorname>CL_INVALID_VALUE</errorname> if <varname>param_name</varname> is
              not valid, or if size in bytes specified by <varname>param_value_size</varname>
              is &lt; size of return type as described in the table above and
              <varname>param_value</varname> is not NULL.
            </listitem>

            <listitem>
              Returns <errorname>CL_INVALID_PROGRAM</errorname> if <varname>program</varname>
              is a not a valid program object.
            </listitem>

            <listitem>
              <errorname>CL_OUT_OF_RESOURCES</errorname> if there is a failure to allocate
              resources required by the OpenCL implementation on the device.
            </listitem>

            <listitem>
              <errorname>CL_OUT_OF_HOST_MEMORY</errorname> if there is a failure to allocate
              resources required by the OpenCL implementation on the host.
            </listitem>
    </itemizedlist>
  </refsect1>

<!-- ================================ EXAMPLE  -->
<!-- DO NOT DELETE IN CASE AN EXAMPLE IS ADDED IN THE FUTURE -->
<!--
    <refsect2 id="example1">
        <title>
            Example
        </title>

        <informaltable frame="none">
            <tgroup cols="1" align="left" colsep="0" rowsep="0">
                <colspec colname="col1" colnum="1" />
                <tbody>
                    <row>
                        <entry>
                            Example goes here - it will be set in "code" type with white space preserved.
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </informaltable>
    </refsect2>
-->

<!-- ================================ SPECIFICATION  -->
<!-- Set the "uri" attribute in the <olink /> element to the "named destination" for the PDF page
-->
    <refsect1 id="specification"><title>Specification</title>
        <para>
            <imageobject>
                <imagedata fileref="pdficon_small1.gif" format="gif" />
            </imageobject>

            <olink uri="clGetProgramBuildInfo">OpenCL Specification</olink>
        </para>
    </refsect1>

<!-- ================================ ALSO SEE  -->

    <refsect1 id="seealso"><title>Also see</title>
        <para>
            <citerefentry><refentrytitle>clGetProgramInfo</refentrytitle></citerefentry>
        </para>
    </refsect1>

<!-- ================================ COPYRIGHT  -->
<!-- Content included from copyright.inc.xsl -->

    <refsect3 id="Copyright"><title></title>
        <imageobject>
                <imagedata fileref="KhronosLogo.jpg" format="jpg" />
        </imageobject>
        <para />
    </refsect3>

 <!-- 26-Oct-2015, API rev. 19 -->
</refentry>

