blob: 1a21a2064c23ce1921d0ad5eedfbbe8d31d68683 [file] [log] [blame]
/* --COPYRIGHT--,EPL
* Copyright (c) 2008 Texas Instruments and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Texas Instruments - initial implementation
*
* --/COPYRIGHT--*/
/*
* ======== ITarget.xdc ========
*/
package xdc.bld;
/*!
* ======== ITarget ========
* The interface between code generation tool-chains and the XDC Build
* Engine.
*
* This interface defines an abstract interface that must be supported by
* a compiler tool-chain in order to be used in an XDC build environment.
* This interface allows the XDC Build engine to treat all compiler tool
* chains uniformly; thus, it is possible to add support for a new compiler
* without making *any* changes to the build engine.
*/
metaonly interface ITarget {
/*!
* ======== Model ========
* Target runtime model.
*
* @field(`endian`) this string specifies the endianess of the
* generated code. Valid values include:
* @p(dlist)
* - `"big"`
* big endian
* - `"little"`
* little endian
* - `null`
* unspecified
* @p
*
* @field(`codeModel`) this string specifies a target-specific code size
* model. Valid values include:
* @p(dlist)
* - `"near"`
* C54 near mode
* - `"far"`
* C54 far mode
* - `undefined`
* unspecified
* @p
*
* @field(`dataModel`) this string specifies a target-specific data size
* model. Valid values include:
* @p(dlist)
* - `"large"`
* C55, C28 large model
* - `undefined`
* unspecified
* @p
*
* @field(`shortEnums`) this flag specifies if a target fits the values
* of an enumeration into the smallest integer type
* that can accept all values. If that is the case,
* this flag must be set to `true`. If all values are
* the size of an Int, this flag can be either set
* to `false` or left unspecified.
* @see #model
*/
struct Model {
String endian; /*! endian-ness of this target */
String codeModel; /*! target-specific code model */
String dataModel; /*! target-specific data model */
Bool shortEnums; /*! if true, enums are packed into smallest integral type */
}
/*!
* ======== name ========
* Nickname for this target.
*
* This name is typically the name of the module without the package
* name prefix. Thus, it is not necessarily globally unique.
*
* Use the `$name` property of the module to get a globally unique name
* for the target.
*/
readonly config String name;
/*!
* ======== suffix ========
* Suffix appended to all objs, libraries, and executable.
*
* All files generated by this target (object files, archives,
* executables, etc.) have file names whose extensions end with
* suffix. In particular, targets create files with the following
* extensions:
* @p(dlist)
* - `".a<suffix>"`
* archive files (i.e., libraries)
* - `".o<suffix>"`
* object files
* - `".s<suffix>"`
* assembly language source (see `{@link #scompile()}`)
* - `".x<suffix>"`
* executable files
* @p
* This suffix should be chosen to globally and uniquely identify the
* EABI (Embedded Application Binary Interface) of the objects produced
* by this target. Targets with the same suffix should produce 100% EABI
* compatible objects and, targets with different suffixes should produce
* objects with incompatible EABIs.
*
* @see #scompile()
*/
readonly config String suffix;
/*!
* ======== compatibleSuffixes ========
* Array of suffixes used by targets compatible with this target
*
* This array is used to identify a set of targets that produce
* code that can be linked with code produced by this target, where the
* order of suffixes defines the order of preferrence. This
* parameter is used by `findSuffixes()`.
*
* For example, an Arm target which builds for v6 architecture might have
* the following values in its `compatibleSuffix`: ["v5T", "MV470"].
* This means that code produced by targets with suffixes "v5T' and
* "MV470" can be linked with code produced by that target, and that "v5T"
* code is more preferred than "MV470" code.
*/
config String compatibleSuffixes[];
/*!
* ======== isa ========
* CPU Instruction Set Architecture (ISA)
*
* This parameter is used to identify a set of targets that produce
* code for a common ISA. This is used by build scripts that need to
* build for all targets that support a particular device.
*
* For example, the build script for a package that is designed for
* the TMS32064xx (and no other CPU) can easily specify that it
* should be built for all targets that generate code for the
* TMS320C64xx without having to specify a specific target. This
* allows the user to add new targets (big endian, little endian,
* different compilers, etc.) that build for the TMS320C64xx without
* having to modify the package's build script.
*
* Note that this field should not be confused with platform ISA
* names; this field is defined by target tool-chains and may differ
* from the names given by a CPU device.
*
* @see xdc.platform.ICpuDataSheet
*/
readonly config String isa;
/*!
* ======== model ========
* Run-time model
*
* This structure identifies a particular run-time model
* used by the compiler to generate instructions.
*/
readonly config Model model;
/*!
* ======== os ========
* Name of OS required to run programs built for this target.
*
* Native executables are run by the host OS. This OS often
* defines runtime interfaces that all executables (implicitly or
* explicitly) use.
*
* If os is undefined, then no OS is required.
*/
readonly config String os;
/*!
* ======== rts ========
* Name of a run-time support package to include
*
* Development environments often provide a set of common run-time
* support functions that all other code can easily utilize; e.g.,
* some means for performing a "printf", normal program termination
* with "exit status", etc. If the `rts` parameter is non-`null`, it is
* the name of a package that is implicitly imported when building
* any executable that is built using this target. If `rts` is
* undefined, no rts package is imported.
*
* This parameter makes it possible for the target producer to name
* a package that provides a target-specific implementation of a runtime
* support interface. Clients of a target do not need to explicitly
* name a target specific rts implementation; thus, it is not
* possible for the client to inadvertently name the wrong (or an
* incompatible) rts implementation.
*
* Note: this package is *NOT* included if the executable's
* `{@link xdc.bld.Executable#attrs}.rtsName` attribute is set to `null`;
* see {@link xdc.bld.Executable#Attrs}.
*/
readonly config String rts;
/*!
* ======== base ========
* A target that this target is based upon.
*
* If non-`null`, this target shares the same tool-chain of the specified
* base target. This parameter is used to determine various default
* values for target configuration parameters. For example, the default
* setting of `{@link #rootDir}` is the value of the base's
* `{@link #rootDir}` setting.
*/
readonly config ITarget.Module base;
/*!
* ======== dllExt ========
* @_nodoc dlls are not yet fully supported
*/
config String dllExt;
/*!
* ======== execExt ========
* Extension for executables.
*
* Operating systems and tools often have a strong preference for a
* specific extension for executables; e.g., Windows expects executables
* to have the extension "`.exe`". If this parameter is set, executables
* will be given the specified extension instead of the default
* "`.x<suffix>`", where `<suffix>` is the target's suffix parameter.
*
* The `execExt` is an expression that is expanded prior to use.
* Expressions of the form "`$(name)`" within the
* pattern string are expanded if "`name`" is one of the built-in
* variables listed below.
*
* Built-in variables for `execExt`:
* @p(dlist)
* - `trgName`
* the target's `name` property
* - `trgSuffix`
* the target's `suffix` property
* - `platPName`
* the executable's platform package name
* - `platIName`
* the executable's platform instance name
* @p
*
* @a(Example) If you want to build a portable executable for multiple
* targets side-by-side and you want (or need) to use a fixed extension
* such as ".out" for all executables, setting `execExt` to
* `"_$(trgSuffix).out"` for all targets ensures that all generated
* executables will have unique names and yet share a common extension
* of `".out"`.
*/
config String execExt;
/*!
* ======== platform ========
* The default platform name for this target
*
* Build scripts often build for just one platform per target. This
* parameter allows one to establish a default platform for each
* target in a build.
*
* If this parameter is `null` or `undefined` and `{@link #platforms}`
* array is non-empty, it is initialized to be the first element of the
* platforms array (i.e., `{@link #platforms[0]}`).
*/
config String platform;
/*!
* ======== platforms ========
* A set of platforms that can support this target
*
* Some build scripts build executables for "all" platforms; e.g.,
* regression test suites. This parameter allows one to establish
* a set of platforms that build scripts can legitimately use to
* create executables, for example.
*
* If this array is empty (i.e., has length 0) and `{@link #platform}`
* is non-`null`, platforms is initialized to an array of one element
* equal to `{@link #platform}`.
*/
config String platforms[] = [];
/*!
* ======== binaryParser ========
* The name of a object file parser
*
* The value of this configuration parameter is the name of a
* module or Java class that implements the `xdc.rta.IOFReader` interface.
* This interface is used to extract information from the object files
* produced by this target.
*
* @_nodoc object file readers are not yet fully supported
*/
config String binaryParser;
/*!
* ======== version ========
* The Compatibility Key associated with this target.
*
* @a(Readonly) This value is automatically computed by the XDC Build
* Engine by executing the `{@link #getVersion()}` function after
* `package.bld` completes but prior to generating `package.mak`.
*/
config String version;
/*!
* ======== versionRaw ========
* The unmodified version string associated with this target.
*
* @a(Readonly) This value is automatically computed by the XDC Build
* Engine by executing the `{@link #getVersion()}` function after
* `package.bld` completes but prior to generating `package.mak`.
*
* @_nodoc
*/
config String versionRaw;
/*!
* ======== DebugGen ========
* Debugger integration support.
*
* This structure specifies additional files that are generated
* in order to support integration with a debugger. For example, the
* default setting for TI targets specifies the generation of CCS
* project files that allow one to easily debug executables that have
* been constructed from multiple packages.
*
* There are two "types" of debug support files that are generated;
* one for the package as a whole, and one for each executable.
* Since packages may contain portable sources that are built for more
* than one target, a "package-level" file is generated for each target
* used in the package. A separate file is generated for each
* executable built within the package.
*
* The `execTemplate` and `packageTemplate` fields name a template that
* is expanded in the context of the config model and the build
* model, respectively. These fields should be set to a file name
* string which is relative to the package path; e.g., the string
* "`ti/targets/cc_exec.xdt`" refers to the file "`cc_exec.xdt`" in the
* `ti.targets` package located along the package path.
*
* Preconditions for the `execTemplate`:
* @p(dlist)
* - `this`
* the configured program object (`xdc.cfg.Program`);
* i.e., the program object *after* the program's
* configuration script completes.
* - `$args`
* array of arguments passed to the template
*
* - `$args[1]`
* the name of the executable being produced for this
* configuration.
*
* - `environment`
* hash table of XDC global parameters; e.g., `"xdc.path"`,
* `"xdc.root"`, ...
* @p
* Preconditions for the `packageTemplate`:
* @p(dlist)
* - `this`
* the "package contents" object (i.e.,
* `xdc.bld.PackageContents`) *after* the package's
* build script (`package.bld`) completes.
* - `$args`
* array of arguments passed to the template
*
* - `$args[0]`
* the target (a module implementing the
* `{@link xdc.bld.ITarget}` interface)
*
* - `$args[1]`
* hash-table of all package sources
*
* - `environment`
* hash table of XDC global parameters; e.g., `"xdc.path"`,
* `"xdc.root"`, ...
* @p
* The `execPattern` and `packagePattern` fields are expressions that
* are expanded prior to template expansion to determine the name of
* the output file. Expressions of the form "`$(name)`" within the
* pattern string are expanded if "`name`" is one of the built-in
* variables listed below.
*
* Built-in variables for `execPattern`:
* @p(dlist)
* - `cfgName`
* the name of the generated configuration file (without
* any directory prefix);
* - `cfgDir`
* the name of the directory containing the config file;
* - `exeName`
* the name of the executable file (without any
* directory prefix);
* - `exeDir`
* the directory containing the executable file.
* @p
* Both the `exeDir` and `cfgDir` are relative to the directory
* containing the `package.bld` script.
*
* Built-in variables for `packagePattern`:
* @p(dlist)
* - `pkgName`
* the package's name (e.g., `"ti.targets"`);
* - `trgName`
* the target's `name` property;
* - `trgSuffix`
* the target's `suffix` property.
* @p
*
* @see #debugGen
*/
struct DebugGen {
String execTemplate; /*! debugger template for executable */
String execPattern; /*! exec file name pattern */
String packageTemplate; /*! debugger template for package */
String packagePattern; /*! package file name pattern */
}
/*!
* ======== debugGen ========
* Debugger/IDE file generation support.
*
* This parameter allows one to automatically generate files that
* can be used by an IDE to more easily debug (and possibly rebuild)
* specified goals.
*
* To avoid unnecessary build time overhead, these files are not always
* generated; by default, they are only generated for "debug" profiles.
* The generation of these files is controlled by the
* `{@link xdc.cfg.Program#gen}` configuration parameter. To force these
* files to be generated for a particular executable, add the following
* line to the executable's program configuration script:
* @p(code)
* Program.gen.debuggerFiles = true;
* @p
*
* It is also possible to disable the generation of selected files by
* setting the appropriate fields of `{@link #DebugGen}` to `null` in
* your `config.bld` script.
*/
config DebugGen debugGen;
/*!
* ======== Extension ========
* File extension to file type association.
*
* This structure is used by the Build Engine to determine whether a
* file should be treated as C++, C, or assembly language source.
*
* @field(suf) the file extension including any '.' characters
*
* @field(typ) the type of the file having this extension.
* Allowable file type identifiers include:
* @p(dlist)
* - `"c"`
* C language source file
* - `"asm"`
* assembly language source file
* - `"cpp"`
* C++ language source file
* @p
* @see #extensions
*/
struct Extension {
String suf; /*! file extension (including any '.') */
String typ; /*! type of this file; e.g., `"c"`, `"asm"`, ... */
};
/*!
* ======== extensions ========
* File extensions recognized by this target.
*
* This is a user modifiable table used to customize file extensions
* recognized by each target.
*
* For example, to add a new assembly language extension, say "`.s64`",
* to the target `ti.targets.C64P`, add the following lines to the
* build model startup script:
* @p(code)
* var C64P = xdc.module('ti.targets.C64P');
* C64P.extensions[".s64"] = {
* suf: ".s64", typ: "asm"
* };
* @p
* Note that individual targets may add additional language types.
*
* It is also possible to remove default extensions. For example, to
* remove the "`.asm`" extension from the target `ti.targets.C64P`, add
* the following lines to the build model startup script:
* @p(code)
* var C64P = xdc.module('ti.targets.C64P');
* delete C64P.extensions[".asm"];
* @p
*/
config Extension extensions[string] = [
[".asm", {suf: ".asm", typ: "asm"}],
[".c", {suf: ".c", typ: "c" }],
[".cpp", {suf: ".cpp", typ: "cpp"}],
[".cxx", {suf: ".cxx", typ: "cpp"}],
[".C", {suf: ".C", typ: "cpp"}],
[".cc", {suf: ".cc", typ: "cpp"}],
];
/*!
* ======== versionMap ========
* Map of compiler version numbers to compatibility keys.
*
* `versionMap` is a user modifiable table used to map tool-chain
* version numbers to Compatibility Keys.
*
* Each target defines the format of the tool-chain version obtained
* from the tool-chain. The user can then map new tool-chain version
* strings to an appropriate compatibility key.
*
* Each target must respect the mapping defined by this table; i.e.,
* if the user supplies a compatibility key in this map, it must be
* returned when `{@link #getVersion()}` is called.
*
* Thus, it is possible for the user to assert that any two compiler
* tool chains should be treated as equivalent (or incompatible) by
* mapping their version numbers to identical (incompatible)
* compatibility keys.
*
* @see ti.targets.ITarget#versionMap
*/
config String versionMap[string] = [
];
/*!
* ======== alignDirectiveSupported ========
* The compiler supports an align directive.
*/
readonly config Bool alignDirectiveSupported = false;
/*!
* ======== rootDir ========
* Installation directory for this target's code generation tools.
*
* Since each target potentially "wraps" a different compiler tool-chain
* and each tool-chain will, in general, assume a different physical
* design for the installation of the compiler and its associated
* libraries and headers, one must consult each specific target to know
* how to set this parameter.
*
* If the `{@link #base}` parameter is `null`, this parameter *must* be
* set by the user; otherwise, `rootDir` defaults to the value
* `base.rootDir`.
*/
config String rootDir;
/*!
* ======== CompileOptions ========
* Options passed to the compiler/assembler.
*
* @field(aopts) a string of target-specific assembler options
* @field(copts) a string of target-specific C/C++ compiler options
* @field(cfgcopts) a string of C/C++ compiler options for C config file,
* includes 'copts' in addition to the value passed
* @field(defs) a string of macro definitions each of the form
* "`-Dname=value`" separated by white space
* @field(incs) a string of include directories each of the form
* "`-Idir`" separated by white space
*
* @a(Predefined Macros)
* The XDC Build Engine automatically adds several predefined macros via
* `-D` definitions that enable conditional compilation of source files
* based on build-specific attributes.
* @p(dlist)
* - `xdc_bld__profile_`{profile_name}
* this symbol is always defined and {profile_name} is the
* compile goal's (see `{@link #CompileGoal}`) profile name.
* @p
*
* In addition, each target defines a set of macros that enable clients
* to portably support big/little endian targets, for example. These
* macros are indirectly included by sources that include `xdc/std.h`;
* see `{@link xdc}`.
*
* @see #OptionSet
* @see #CompileGoal
* @see xdc
*/
struct CompileOptions {
String aopts; /*! goal specific ASM options */
String copts; /*! goal specific C compiler options */
String cfgcopts; /*! goal specific C config file options */
String defs; /*! goal specific C/ASM definition options */
String incs; /*! goal specific C/ASM include options */
};
/*!
* ======== OptionSet ========
* Collection of tool-chain options.
*
* This structure is used to define a collection of tool-chain
* options that are used as a group to achieve some effect supported
* by the tool-chain. For example, some compilers require that
* specific options be passed to the compiler *and* linker in order
* to generate execution profile information or code coverage
* statistics.
*
* @field(compilerOptions) a set of compiler/assembler options
* @field(linkOpts) a string of target-specific linker options
* @field(archiveOpts) a string of target-specific archiver options
* @field(filters) an array of filters applied (in order) to
* tool-chain commands
*
* @see #profiles
*/
struct OptionSet {
CompileOptions compileOpts; /*! profile-specific compiler opts */
String linkOpts; /*! profile-specific linker opts */
String archiveOpts; /*! profile-specific archiver opts */
ITargetFilter.InstDesc filters[]; /*! ITargetFilter instance descs */
};
/*!
* ======== profiles ========
* Profiles supported by this target.
*
* A profile is a collection of tool options used to create a
* library or executable that supports a certain "flavor" of library
* or executable; e.g., "debug" or "release".
*
* Some profile names are supported by all targets even though the
* targets use different compilers (and therefore different options).
* These profile names makes it possible for a package to build
* libraries or executables in a "debug" (or "release") profile
* independent of the target, for example.
*
* All targets are required to support "debug" and "release" profile
* names.
*
* Profile options are added to beginning of any goal specific options
* specified by the user before being passed to the target.
*/
config OptionSet profiles[string] = [
["release", {}],
["debug", {}],
];
/*!
* ======== CompileGoal ========
* The goal specification passed to the `{@link #compile}`
* function.
*
* @see #compile
* @see #scompile
*/
struct CompileGoal {
String base; /*! base name of the source and destination */
String dstPrefix; /*! directory prefix of destination file */
String dstSuffix; /*! suffix of destination file; e.g., ".o62" */
String srcSuffix; /*! optional suffix of source file; e.g., ".c" */
String srcPrefix; /*! optional directory prefix of source file */
String profile; /*! index into profiles map */
CompileOptions opts;/*! goal specific compiler options */
Bool configOpts; /*! true if compiling the generated C config file */
};
/*!
* ======== LinkGoal ========
* The goal specification passed to the `{@link #link}` function.
*
* @see #link
*/
struct LinkGoal {
String base; /*! base name of the source and destination */
String dstPrefix; /*! directory prefix of destination file */
String dstSuffix; /*! suffix of destination file; e.g., ".x62" */
String files; /*! string of files to link with */
String profile; /*! index into profiles map */
String opts; /*! goal specific linker options */
Bool dllMode; /*! true if we're linking an assembly */
Bool isRom; /*! reflects the `isRom` attribute */
};
/*!
* ======== ArchiveGoal ========
* The goal specification passed to the `{@link #archive}`
* function.
*
* @see #archive
*/
struct ArchiveGoal {
String base; /*! base name of the source and destination */
String dstPrefix; /*! directory prefix of destination file */
String dstSuffix; /*! suffix of destination file; e.g., ".a62" */
String files; /*! String of files to archive */
String profile; /*! index into profiles map */
String opts; /*! goal specific archiver options */
};
/*!
* ======== CommandSet ========
* The commands necessary to create a specified goal.
*
* This structure is the return value of the `{@link #compile}`,
* `{@link #link}` and `{@link #archive}` functions. This value is then
* used to generate a makefile or any other files necessary to generate
* a specified goal.
*
* @field(msg) a brief synopsis of the commands specified by `cmds`;
* this string is output in lieu of `cmds` when building
* in "non-verbose" mode.
*
* @field(cmds) a single string of commands that must be executed
* to complete the specified operation. Multiple
* commands may be specified by separating each command
* with the '\n' character.
*
* To facilitate the creation of "portable" makefiles and
* to simplify the implementation of targets, certain
* distinguished "macros" may be embedded in this string.
* The build engine replaces these macros with the
* values described below.
* @p(dlist)
* - `$(rootDir)`
* the target's `{@link #rootDir}` configuration
* parameter
* - `$(packageBase)`
* the target package's
* `{@link xdc.IPackage#packageBase}` property
* - `$(XDCINCS)`
* a set of "-I" options that names each
* repository in the package path
* @p
*
* @field(envs) an array of "name=value" strings that represent
* environment variables that are defined prior to the
* execution of the commands specified by `cmds`
*
* @field(path) an array of directory names that are used to compose
* the PATH environment variable that is in effect when
* the commands specified by `cmds` are run.
*
* @see #archive
* @see #compile
* @see #scompile
* @see #link
*/
struct CommandSet {
String msg; /*! brief message describing subsequent commands */
String cmds; /*! commands necessary to generate goal */
String path[]; /*! host-independent representation of PATH */
String envs[]; /*! environment variable settings for the cmds */
};
/*!
* ======== archive ========
* Create an archive.
*
* This function is called during makefile generation to convert build
* goals into specific commands that generate the specified goal.
*
* @param(goal) the `{@link #ArchiveGoal}` defining the archive to build.
*
* @a(returns)
* This function returns a `{@link #CommandSet}`. If non-`null`, this
* object defines the commands that must be executed to create the
* specified object file. If `null`, then goal can not be achieved.
*
* @a(throws) `Error` exceptions are thrown for fatal errors.
*/
CommandSet* archive(ArchiveGoal *goal);
/*!
* ======== compile ========
* Compile a source file into an object file.
*
* This function is called during makefile generation to convert build
* goals into specific commands that generate the specified object
* file goal.
*
* @param(goal) a `{@link #CompileGoal}` that specifies what file to
* compile, the output file name, and any goal-specific
* options to use
*
* @a(returns)
* This function retuns a `{@link #CommandSet}`. If non-`null`,
* this object defines the commands that must be executed to create the
* specified object file. If `null`, then goal can not be achieved.
*
* @a(throws) `Error` exceptions are thrown for fatal errors.
*/
CommandSet* compile(CompileGoal *goal);
/*!
* ======== scompile ========
* Compile a source file into an assembly language file.
*
* This function is called during makefile generation to convert build
* goals into specific commands that generate the specified assembly
* language source goal.
*
* @param(goal) a `{@link #CompileGoal}` that specifies what file to
* compile, the output file name, and any goal-specific
* options to use
*
* @a(returns)
* This function returns a `{@link #CommandSet}`. If non-`null`, this
* object defines the commands that must be executed to create the
* specified assembly language file. If `null`, then goal
* can not be achieved or is unnecessary (e.g., because
* the source file is already an asm file).
*
* @a(throws) `Error` exceptions are thrown for fatal errors.
*/
CommandSet* scompile(CompileGoal *goal);
/*!
* ======== link ========
* Link object files to produce an executable.
*
* This function is called during makefile generation to convert build
* goals into specific commands that generate the specified goal.
*
* @param(goal) a `{@link #LinkGoal}` that specifies the output file
* name, a list of files to link with, and any goal-specific
* options to use
*
* @a(returns)
* This function returns a `{@link #CommandSet}`. If non-`null`, this
* object defines the commands that must be executed to create the
* specified object file. If `null`, then goal can not be
* achieved.
*
* @a(throws) `Error` exceptions are thrown for fatal errors.
*/
CommandSet* link(LinkGoal *goal);
/*!
* ======== getVersion ========
* Get a target-specific Compatibility Key string
*
* This function is called during makefile generation to obtain a
* target-specific Compatibility Key string. This string is of the
* form:
* @p(code)
* "<pkg>.<mod>{<d0>,<d1>,<d2>,<d3>"
* @p
* where, `<pkg>.<mod>` is the name of the target, and `<d0>`, `<d1>`,
* etc. forms a Compatibility Key.
*
* @a(returns)
* This function returns a string that encodes the name of the target
* and its Compatibility Key.
*
* @a(throws) `Error` exceptions are thrown for fatal errors.
*/
String getVersion();
typedef String StringArray[];
/*!
* ======== getISAChain ========
* Get this target's ISA "is compatible with" relation.
*
* Returns an array of ISA names (including this target's ISA) that
* represents the "is a" relation between ISA's. The array starts with
* the most general ISA and ends with this target's ISA or with the
* optionally specified argument. This relation is used to:
* @p(nlist)
* - pre-define macro definitions that enable code to be
* conditionally compiled based on compatible versions of a
* target's ISA.
*
* - locate appropriate source files during makefile generation;
* each ISA named in a chain causes the extensions ".s"isa to be
* added to the ITarget.extensions table (in the reverse order
* that they appear in the chain). For example, if a target's
* ISA is "64P" and the returned chain is ["62", "64", "64P"],
* the following assembly language suffixes are added to
* the target's extensions table: ".s64P", ".s64", ".s62".
* @p
*
* This relation may also be used in the future to help validate
* combinations of targets and platforms; a target's CPU ISA must
* appear on the chain specified by the platform's CPU ISA.
*
* @param(isa) the ISA identifier string for the ISA to lookup; if null
* then the target's ISA is used (ITarget.isa).
*
* @a(returns)
* This function returns an array of ISA strings where the last string
* is the optionally specified ISA string or this target's ISA,
* and the first string is the "base" ISA in the
* is source compatible" relationship.
* If the specified ISA string is not in this target's chain
* of compatible targets, `null` is returned.
*
* @a(throws) `Error` exceptions are thrown for fatal errors.
*
*/
function getISAChain(isa);
/*!
* ======== findSuffix ========
* Find the suffix that is compatible with this target.
*
* This function determines the list of targets supported by the
* package given as the argument. From that list, this function
* returns the suffix of a target that is compatible with this target.
* Compatibility in this case means that object files created by a
* target having the suffix returned by this function can be linked
* into an executable produced using this target. In the case where more
* than one suffix is compatible, this function returns a suffix in the
* following order of preference:
* @p(nlist)
* - if this target's suffix is in the list, that suffix is returned.
*
* - suffixes from `compatibleSuffixes` are matched against the list
* in the order they appear in `compatibleSuffixes`, and the first one
* found in the list is returned.
* @p
*
* @param(pkg) a package object or an array of target suffix strings
* (see `{@link #suffix}`).
*
* @a(returns)
* This function returns the suffix string of a target compatible with
* this target or `null` if `pkg` does not support any target compatible
* with this target.
*
*/
function findSuffix(pkg);
/*!
* ======== selectSuffix ========
* Select the suffix that is compatible with this target.
*
* From a list of suffixes supplied as an argument, this function
* returns the suffix compatible with this target. Compatibility in
* this case means that object files created by a target having the
* suffix returned by this function can be linked into an executable
* produced using this target. In the case where more than one suffix
* is compatible, this function returns a suffix in the following order
* of preference:
* @p(nlist)
* - if this target's suffix is in the list, that suffix is returned.
*
* - suffixes from `compatibleSuffixes` are matched against the list
* in the order they appear in `compatibleSuffixes`, and the first one
* found in the list is returned.
* @p
*
* @param(suffixList) an array of target suffix strings
* (see `{@link #suffix}`).
*
* @a(returns)
* This function returns the suffix string of a target compatible with
* this target or `null` if no such suffix is found in the list of
* suffixes specified by the first argument.
*
*/
String selectSuffix(StringArray suffixList);
/*!
* ======== sectMap ========
* Output section name to segment type mapping
*
* This hash table is used to determine whether a particular object file
* output section (".text", ".stack", etc.) requires 'data', 'code' or
* 'stack' memory segment.
*
* This `sectMap` is referenced by linker command file templates during
* generation to create linker command files. The Platform defines the
* default memory segments for code and data, and based on this map and
* the default segments, the linker command file template places an
* output section into a physical memory segment.
*
* Note that the `{@link xdc.cfg.Program}` object and the
* `{@link xdc.platform.IPlatform}` instance have a
* `sectMap` parameter. Both the `Program`'s and `IPlatform`'s `sectMap`
* can augment and/or override the placement for a section, but
* `{@link xdc.cfg.Program#sectMap}` takes precedence. Therefore, this
* `sectMap` and the default segments from the platform define an
* initial section map which is then augmented by the `Program`'s and
* `IPlatform`'s section map.
*/
readonly config String sectMap[string];
/*!
* ======== TypeInfo ========
* @_nodoc
*
* @see #StdTypes
*/
struct TypeInfo {
int size;
int align;
}
/*!
* ======== StdTypes ========
* Standard base types supported by all targets
*
* @see #stdTypes
*/
struct StdTypes {
TypeInfo t_IArg;
TypeInfo t_Char;
TypeInfo t_Double;
TypeInfo t_Float;
TypeInfo t_Fxn;
TypeInfo t_Int;
TypeInfo t_Int8;
TypeInfo t_Int16;
TypeInfo t_Int32;
TypeInfo t_Int40;
TypeInfo t_Int64;
TypeInfo t_Long;
TypeInfo t_LDouble;
TypeInfo t_LLong;
TypeInfo t_Ptr;
TypeInfo t_Short;
TypeInfo t_Size;
}
/*!
* ======== stdInclude ========
* Standard C/C++ types header
*
* This string identifies a header containing the C/C++ definitions
* required to enable use of `xdc/std.h` in C/C++ sources; see
* `{@link xdc}`.
*
* The value of this string is used by `xdc/std.h` to include
* target-specific definitions of the types `Int8`, `Int16`, etc. In
* addition, this header supplies target-specific definitions of the
* predefined `xdc_target__*` macros required by `{@link xdc xdc/std.h}`.
*
* Since this header must supply target-specific values for
* target-independent names the structure of this header is usually of
* the form:
* @p(code)
* // if target macros are not already defined,
* #if !defined(xdc_target_macros_include__)
* // include target-specific definitions
* #if defined(TARGET1)
* #include "target1.h"
* #elif defined(TARGET2)
* #include "target2.h"
* #elif ...
* :
* #else
* #error unsupported target
* #endif
* #endif
* // include common definitions
* :
* @p
* The check of the symbol `xdc_target_macros_include__` exists to
* allow others that define new targets to include this header to
* get common definitions for a family of related targets.
*
* To simplify the creation of the target-specific header files, the
* template file `stddefs.xdt` in this package can be used to
* automatically generate the required definitions from each target's
* `.xdc` specification.
*/
readonly config String stdInclude;
/*!
* ======== stdTypes ========
* Size and alignment for standard base types
*
* The values of size are the values returned by the
* target-specific `sizeof()` operator applied to the specified
* type (as defined by the C language). The align value is the number
* of chars used in the alignment of the specified type.
*/
readonly config StdTypes stdTypes = {
t_IArg : { size: 0, align: 0 },
t_Char : { size: 0, align: 0 },
t_Double : { size: 0, align: 0 },
t_Float : { size: 0, align: 0 },
t_Fxn : { size: 0, align: 0 },
t_Int : { size: 0, align: 0 },
t_Int8 : { size: 0, align: 0 },
t_Int16 : { size: 0, align: 0 },
t_Int32 : { size: 0, align: 0 },
t_Int40 : { size: 0, align: 0 },
t_Int64 : { size: 0, align: 0 },
t_Long : { size: 0, align: 0 },
t_LDouble : { size: 0, align: 0 },
t_LLong : { size: 0, align: 0 },
t_Ptr : { size: 0, align: 0 },
t_Short : { size: 0, align: 0 },
t_Size : { size: 0, align: 0 },
};
/*!
* ======== bitsPerChar ========
* The number of bits in a variable of type `char`
*
* This constant allows one to determine the precise number of bits in
* each of the types specified in the stdTypes map. For example, the
* number of bits in the target `T`'s `int` type is
* @p(code)
* T.stdTypes.t_Int.size * T.bitsPerChar
* @p
*/
readonly config Int bitsPerChar = 8;
}