diff options
Diffstat (limited to 'share/doc/gccint/Label-Output.html')
-rw-r--r-- | share/doc/gccint/Label-Output.html | 671 |
1 files changed, 671 insertions, 0 deletions
diff --git a/share/doc/gccint/Label-Output.html b/share/doc/gccint/Label-Output.html new file mode 100644 index 0000000..9829bb8 --- /dev/null +++ b/share/doc/gccint/Label-Output.html @@ -0,0 +1,671 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<!-- Copyright (C) 1988-2023 Free Software Foundation, Inc. + +Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with the +Invariant Sections being "Funding Free Software", the Front-Cover +Texts being (a) (see below), and with the Back-Cover Texts being (b) +(see below). A copy of the license is included in the section entitled +"GNU Free Documentation License". + +(a) The FSF's Front-Cover Text is: + +A GNU Manual + +(b) The FSF's Back-Cover Text is: + +You have freedom to copy and modify this GNU Manual, like GNU + software. Copies published by the Free Software Foundation raise + funds for GNU development. --> +<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ --> +<head> +<title>GNU Compiler Collection (GCC) Internals: Label Output</title> + +<meta name="description" content="GNU Compiler Collection (GCC) Internals: Label Output"> +<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Label Output"> +<meta name="resource-type" content="document"> +<meta name="distribution" content="global"> +<meta name="Generator" content="makeinfo"> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<link href="index.html#Top" rel="start" title="Top"> +<link href="Option-Index.html#Option-Index" rel="index" title="Option Index"> +<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents"> +<link href="Assembler-Format.html#Assembler-Format" rel="up" title="Assembler Format"> +<link href="Initialization.html#Initialization" rel="next" title="Initialization"> +<link href="Uninitialized-Data.html#Uninitialized-Data" rel="previous" title="Uninitialized Data"> +<style type="text/css"> +<!-- +a.summary-letter {text-decoration: none} +blockquote.smallquotation {font-size: smaller} +div.display {margin-left: 3.2em} +div.example {margin-left: 3.2em} +div.indentedblock {margin-left: 3.2em} +div.lisp {margin-left: 3.2em} +div.smalldisplay {margin-left: 3.2em} +div.smallexample {margin-left: 3.2em} +div.smallindentedblock {margin-left: 3.2em; font-size: smaller} +div.smalllisp {margin-left: 3.2em} +kbd {font-style:oblique} +pre.display {font-family: inherit} +pre.format {font-family: inherit} +pre.menu-comment {font-family: serif} +pre.menu-preformatted {font-family: serif} +pre.smalldisplay {font-family: inherit; font-size: smaller} +pre.smallexample {font-size: smaller} +pre.smallformat {font-family: inherit; font-size: smaller} +pre.smalllisp {font-size: smaller} +span.nocodebreak {white-space:nowrap} +span.nolinebreak {white-space:nowrap} +span.roman {font-family:serif; font-weight:normal} +span.sansserif {font-family:sans-serif; font-weight:normal} +ul.no-bullet {list-style: none} +--> +</style> + + +</head> + +<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> +<a name="Label-Output"></a> +<div class="header"> +<p> +Next: <a href="Initialization.html#Initialization" accesskey="n" rel="next">Initialization</a>, Previous: <a href="Uninitialized-Data.html#Uninitialized-Data" accesskey="p" rel="previous">Uninitialized Data</a>, Up: <a href="Assembler-Format.html#Assembler-Format" accesskey="u" rel="up">Assembler Format</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p> +</div> +<hr> +<a name="Output-and-Generation-of-Labels"></a> +<h4 class="subsection">18.20.4 Output and Generation of Labels</h4> + +<p>This is about outputting labels. +</p> +<a name="index-assemble_005fname"></a> +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fLABEL"></a>Macro: <strong>ASM_OUTPUT_LABEL</strong> <em>(<var>stream</var>, <var>name</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> the assembler definition of a label named <var>name</var>. +Use the expression <code>assemble_name (<var>stream</var>, <var>name</var>)</code> to +output the name itself; before and after that, output the additional +assembler syntax for defining the name, and a newline. A default +definition of this macro is provided which is correct for most systems. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fFUNCTION_005fLABEL"></a>Macro: <strong>ASM_OUTPUT_FUNCTION_LABEL</strong> <em>(<var>stream</var>, <var>name</var>, <var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> the assembler definition of a label named <var>name</var> of +a function. +Use the expression <code>assemble_name (<var>stream</var>, <var>name</var>)</code> to +output the name itself; before and after that, output the additional +assembler syntax for defining the name, and a newline. A default +definition of this macro is provided which is correct for most systems. +</p> +<p>If this macro is not defined, then the function name is defined in the +usual manner as a label (by means of <code>ASM_OUTPUT_LABEL</code>). +</p></dd></dl> + +<a name="index-assemble_005fname_005fraw"></a> +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fINTERNAL_005fLABEL"></a>Macro: <strong>ASM_OUTPUT_INTERNAL_LABEL</strong> <em>(<var>stream</var>, <var>name</var>)</em></dt> +<dd><p>Identical to <code>ASM_OUTPUT_LABEL</code>, except that <var>name</var> is known +to refer to a compiler-generated label. The default definition uses +<code>assemble_name_raw</code>, which is like <code>assemble_name</code> except +that it is more efficient. +</p></dd></dl> + +<dl> +<dt><a name="index-SIZE_005fASM_005fOP"></a>Macro: <strong>SIZE_ASM_OP</strong></dt> +<dd><p>A C string containing the appropriate assembler directive to specify the +size of a symbol, without any arguments. On systems that use ELF, the +default (in <samp>config/elfos.h</samp>) is ‘<samp>"\t.size\t"</samp>’; on other +systems, the default is not to define this macro. +</p> +<p>Define this macro only if it is correct to use the default definitions +of <code>ASM_OUTPUT_SIZE_DIRECTIVE</code> and <code>ASM_OUTPUT_MEASURED_SIZE</code> +for your system. If you need your own custom definitions of those +macros, or if you do not need explicit symbol sizes at all, do not +define this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fSIZE_005fDIRECTIVE"></a>Macro: <strong>ASM_OUTPUT_SIZE_DIRECTIVE</strong> <em>(<var>stream</var>, <var>name</var>, <var>size</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> a directive telling the assembler that the size of the +symbol <var>name</var> is <var>size</var>. <var>size</var> is a <code>HOST_WIDE_INT</code>. +If you define <code>SIZE_ASM_OP</code>, a default definition of this macro is +provided. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fMEASURED_005fSIZE"></a>Macro: <strong>ASM_OUTPUT_MEASURED_SIZE</strong> <em>(<var>stream</var>, <var>name</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> a directive telling the assembler to calculate the size of +the symbol <var>name</var> by subtracting its address from the current +address. +</p> +<p>If you define <code>SIZE_ASM_OP</code>, a default definition of this macro is +provided. The default assumes that the assembler recognizes a special +‘<samp>.</samp>’ symbol as referring to the current address, and can calculate +the difference between this and another symbol. If your assembler does +not recognize ‘<samp>.</samp>’ or cannot do calculations with it, you will need +to redefine <code>ASM_OUTPUT_MEASURED_SIZE</code> to use some other technique. +</p></dd></dl> + +<dl> +<dt><a name="index-NO_005fDOLLAR_005fIN_005fLABEL"></a>Macro: <strong>NO_DOLLAR_IN_LABEL</strong></dt> +<dd><p>Define this macro if the assembler does not accept the character +‘<samp>$</samp>’ in label names. By default constructors and destructors in +G++ have ‘<samp>$</samp>’ in the identifiers. If this macro is defined, +‘<samp>.</samp>’ is used instead. +</p></dd></dl> + +<dl> +<dt><a name="index-NO_005fDOT_005fIN_005fLABEL"></a>Macro: <strong>NO_DOT_IN_LABEL</strong></dt> +<dd><p>Define this macro if the assembler does not accept the character +‘<samp>.</samp>’ in label names. By default constructors and destructors in G++ +have names that use ‘<samp>.</samp>’. If this macro is defined, these names +are rewritten to avoid ‘<samp>.</samp>’. +</p></dd></dl> + +<dl> +<dt><a name="index-TYPE_005fASM_005fOP"></a>Macro: <strong>TYPE_ASM_OP</strong></dt> +<dd><p>A C string containing the appropriate assembler directive to specify the +type of a symbol, without any arguments. On systems that use ELF, the +default (in <samp>config/elfos.h</samp>) is ‘<samp>"\t.type\t"</samp>’; on other +systems, the default is not to define this macro. +</p> +<p>Define this macro only if it is correct to use the default definition of +<code>ASM_OUTPUT_TYPE_DIRECTIVE</code> for your system. If you need your own +custom definition of this macro, or if you do not need explicit symbol +types at all, do not define this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-TYPE_005fOPERAND_005fFMT"></a>Macro: <strong>TYPE_OPERAND_FMT</strong></dt> +<dd><p>A C string which specifies (using <code>printf</code> syntax) the format of +the second operand to <code>TYPE_ASM_OP</code>. On systems that use ELF, the +default (in <samp>config/elfos.h</samp>) is ‘<samp>"@%s"</samp>’; on other systems, +the default is not to define this macro. +</p> +<p>Define this macro only if it is correct to use the default definition of +<code>ASM_OUTPUT_TYPE_DIRECTIVE</code> for your system. If you need your own +custom definition of this macro, or if you do not need explicit symbol +types at all, do not define this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fTYPE_005fDIRECTIVE"></a>Macro: <strong>ASM_OUTPUT_TYPE_DIRECTIVE</strong> <em>(<var>stream</var>, <var>type</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> a directive telling the assembler that the type of the +symbol <var>name</var> is <var>type</var>. <var>type</var> is a C string; currently, +that string is always either ‘<samp>"function"</samp>’ or ‘<samp>"object"</samp>’, but +you should not count on this. +</p> +<p>If you define <code>TYPE_ASM_OP</code> and <code>TYPE_OPERAND_FMT</code>, a default +definition of this macro is provided. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fDECLARE_005fFUNCTION_005fNAME"></a>Macro: <strong>ASM_DECLARE_FUNCTION_NAME</strong> <em>(<var>stream</var>, <var>name</var>, <var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for declaring the name <var>name</var> of a +function which is being defined. This macro is responsible for +outputting the label definition (perhaps using +<code>ASM_OUTPUT_FUNCTION_LABEL</code>). The argument <var>decl</var> is the +<code>FUNCTION_DECL</code> tree node representing the function. +</p> +<p>If this macro is not defined, then the function name is defined in the +usual manner as a label (by means of <code>ASM_OUTPUT_FUNCTION_LABEL</code>). +</p> +<p>You may wish to use <code>ASM_OUTPUT_TYPE_DIRECTIVE</code> in the definition +of this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fDECLARE_005fFUNCTION_005fSIZE"></a>Macro: <strong>ASM_DECLARE_FUNCTION_SIZE</strong> <em>(<var>stream</var>, <var>name</var>, <var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for declaring the size of a function +which is being defined. The argument <var>name</var> is the name of the +function. The argument <var>decl</var> is the <code>FUNCTION_DECL</code> tree node +representing the function. +</p> +<p>If this macro is not defined, then the function size is not defined. +</p> +<p>You may wish to use <code>ASM_OUTPUT_MEASURED_SIZE</code> in the definition +of this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fDECLARE_005fCOLD_005fFUNCTION_005fNAME"></a>Macro: <strong>ASM_DECLARE_COLD_FUNCTION_NAME</strong> <em>(<var>stream</var>, <var>name</var>, <var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for declaring the name <var>name</var> of a +cold function partition which is being defined. This macro is responsible +for outputting the label definition (perhaps using +<code>ASM_OUTPUT_FUNCTION_LABEL</code>). The argument <var>decl</var> is the +<code>FUNCTION_DECL</code> tree node representing the function. +</p> +<p>If this macro is not defined, then the cold partition name is defined in the +usual manner as a label (by means of <code>ASM_OUTPUT_LABEL</code>). +</p> +<p>You may wish to use <code>ASM_OUTPUT_TYPE_DIRECTIVE</code> in the definition +of this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fDECLARE_005fCOLD_005fFUNCTION_005fSIZE"></a>Macro: <strong>ASM_DECLARE_COLD_FUNCTION_SIZE</strong> <em>(<var>stream</var>, <var>name</var>, <var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for declaring the size of a cold function +partition which is being defined. The argument <var>name</var> is the name of the +cold partition of the function. The argument <var>decl</var> is the +<code>FUNCTION_DECL</code> tree node representing the function. +</p> +<p>If this macro is not defined, then the partition size is not defined. +</p> +<p>You may wish to use <code>ASM_OUTPUT_MEASURED_SIZE</code> in the definition +of this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fDECLARE_005fOBJECT_005fNAME"></a>Macro: <strong>ASM_DECLARE_OBJECT_NAME</strong> <em>(<var>stream</var>, <var>name</var>, <var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for declaring the name <var>name</var> of an +initialized variable which is being defined. This macro must output the +label definition (perhaps using <code>ASM_OUTPUT_LABEL</code>). The argument +<var>decl</var> is the <code>VAR_DECL</code> tree node representing the variable. +</p> +<p>If this macro is not defined, then the variable name is defined in the +usual manner as a label (by means of <code>ASM_OUTPUT_LABEL</code>). +</p> +<p>You may wish to use <code>ASM_OUTPUT_TYPE_DIRECTIVE</code> and/or +<code>ASM_OUTPUT_SIZE_DIRECTIVE</code> in the definition of this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fDECLARE_005fCONSTANT_005fNAME"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_DECLARE_CONSTANT_NAME</strong> <em>(FILE *<var>file</var>, const char *<var>name</var>, const_tree <var>expr</var>, HOST_WIDE_INT <var>size</var>)</em></dt> +<dd><p>A target hook to output to the stdio stream <var>file</var> any text necessary +for declaring the name <var>name</var> of a constant which is being defined. This +target hook is responsible for outputting the label definition (perhaps using +<code>assemble_label</code>). The argument <var>exp</var> is the value of the constant, +and <var>size</var> is the size of the constant in bytes. The <var>name</var> +will be an internal label. +</p> +<p>The default version of this target hook, define the <var>name</var> in the +usual manner as a label (by means of <code>assemble_label</code>). +</p> +<p>You may wish to use <code>ASM_OUTPUT_TYPE_DIRECTIVE</code> in this target hook. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fDECLARE_005fREGISTER_005fGLOBAL"></a>Macro: <strong>ASM_DECLARE_REGISTER_GLOBAL</strong> <em>(<var>stream</var>, <var>decl</var>, <var>regno</var>, <var>name</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for claiming a register <var>regno</var> +for a global variable <var>decl</var> with name <var>name</var>. +</p> +<p>If you don’t define this macro, that is equivalent to defining it to do +nothing. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fFINISH_005fDECLARE_005fOBJECT"></a>Macro: <strong>ASM_FINISH_DECLARE_OBJECT</strong> <em>(<var>stream</var>, <var>decl</var>, <var>toplevel</var>, <var>atend</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to finish up declaring a variable name +once the compiler has processed its initializer fully and thus has had a +chance to determine the size of an array when controlled by an +initializer. This is used on systems where it’s necessary to declare +something about the size of the object. +</p> +<p>If you don’t define this macro, that is equivalent to defining it to do +nothing. +</p> +<p>You may wish to use <code>ASM_OUTPUT_SIZE_DIRECTIVE</code> and/or +<code>ASM_OUTPUT_MEASURED_SIZE</code> in the definition of this macro. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fGLOBALIZE_005fLABEL"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_GLOBALIZE_LABEL</strong> <em>(FILE *<var>stream</var>, const char *<var>name</var>)</em></dt> +<dd><p>This target hook is a function to output to the stdio stream +<var>stream</var> some commands that will make the label <var>name</var> global; +that is, available for reference from other files. +</p> +<p>The default implementation relies on a proper definition of +<code>GLOBAL_ASM_OP</code>. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fGLOBALIZE_005fDECL_005fNAME"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_GLOBALIZE_DECL_NAME</strong> <em>(FILE *<var>stream</var>, tree <var>decl</var>)</em></dt> +<dd><p>This target hook is a function to output to the stdio stream +<var>stream</var> some commands that will make the name associated with <var>decl</var> +global; that is, available for reference from other files. +</p> +<p>The default implementation uses the TARGET_ASM_GLOBALIZE_LABEL target hook. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fASSEMBLE_005fUNDEFINED_005fDECL"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_ASSEMBLE_UNDEFINED_DECL</strong> <em>(FILE *<var>stream</var>, const char *<var>name</var>, const_tree <var>decl</var>)</em></dt> +<dd><p>This target hook is a function to output to the stdio stream +<var>stream</var> some commands that will declare the name associated with +<var>decl</var> which is not defined in the current translation unit. Most +assemblers do not require anything to be output in this case. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fWEAKEN_005fLABEL"></a>Macro: <strong>ASM_WEAKEN_LABEL</strong> <em>(<var>stream</var>, <var>name</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> some commands that will make the label <var>name</var> weak; +that is, available for reference from other files but only used if +no other definition is available. Use the expression +<code>assemble_name (<var>stream</var>, <var>name</var>)</code> to output the name +itself; before and after that, output the additional assembler syntax +for making that name weak, and a newline. +</p> +<p>If you don’t define this macro or <code>ASM_WEAKEN_DECL</code>, GCC will not +support weak symbols and you should not define the <code>SUPPORTS_WEAK</code> +macro. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fWEAKEN_005fDECL"></a>Macro: <strong>ASM_WEAKEN_DECL</strong> <em>(<var>stream</var>, <var>decl</var>, <var>name</var>, <var>value</var>)</em></dt> +<dd><p>Combines (and replaces) the function of <code>ASM_WEAKEN_LABEL</code> and +<code>ASM_OUTPUT_WEAK_ALIAS</code>, allowing access to the associated function +or variable decl. If <var>value</var> is not <code>NULL</code>, this C statement +should output to the stdio stream <var>stream</var> assembler code which +defines (equates) the weak symbol <var>name</var> to have the value +<var>value</var>. If <var>value</var> is <code>NULL</code>, it should output commands +to make <var>name</var> weak. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fWEAKREF"></a>Macro: <strong>ASM_OUTPUT_WEAKREF</strong> <em>(<var>stream</var>, <var>decl</var>, <var>name</var>, <var>value</var>)</em></dt> +<dd><p>Outputs a directive that enables <var>name</var> to be used to refer to +symbol <var>value</var> with weak-symbol semantics. <code>decl</code> is the +declaration of <code>name</code>. +</p></dd></dl> + +<dl> +<dt><a name="index-SUPPORTS_005fWEAK"></a>Macro: <strong>SUPPORTS_WEAK</strong></dt> +<dd><p>A preprocessor constant expression which evaluates to true if the target +supports weak symbols. +</p> +<p>If you don’t define this macro, <samp>defaults.h</samp> provides a default +definition. If either <code>ASM_WEAKEN_LABEL</code> or <code>ASM_WEAKEN_DECL</code> +is defined, the default definition is ‘<samp>1</samp>’; otherwise, it is ‘<samp>0</samp>’. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fSUPPORTS_005fWEAK"></a>Macro: <strong>TARGET_SUPPORTS_WEAK</strong></dt> +<dd><p>A C expression which evaluates to true if the target supports weak symbols. +</p> +<p>If you don’t define this macro, <samp>defaults.h</samp> provides a default +definition. The default definition is ‘<samp>(SUPPORTS_WEAK)</samp>’. Define +this macro if you want to control weak symbol support with a compiler +flag such as <samp>-melf</samp>. +</p></dd></dl> + +<dl> +<dt><a name="index-MAKE_005fDECL_005fONE_005fONLY"></a>Macro: <strong>MAKE_DECL_ONE_ONLY</strong> <em>(<var>decl</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to mark <var>decl</var> to be emitted as a +public symbol such that extra copies in multiple translation units will +be discarded by the linker. Define this macro if your object file +format provides support for this concept, such as the ‘<samp>COMDAT</samp>’ +section flags in the Microsoft Windows PE/COFF format, and this support +requires changes to <var>decl</var>, such as putting it in a separate section. +</p></dd></dl> + +<dl> +<dt><a name="index-SUPPORTS_005fONE_005fONLY"></a>Macro: <strong>SUPPORTS_ONE_ONLY</strong></dt> +<dd><p>A C expression which evaluates to true if the target supports one-only +semantics. +</p> +<p>If you don’t define this macro, <samp>varasm.cc</samp> provides a default +definition. If <code>MAKE_DECL_ONE_ONLY</code> is defined, the default +definition is ‘<samp>1</samp>’; otherwise, it is ‘<samp>0</samp>’. Define this macro if +you want to control one-only symbol support with a compiler flag, or if +setting the <code>DECL_ONE_ONLY</code> flag is enough to mark a declaration to +be emitted as one-only. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fASSEMBLE_005fVISIBILITY"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_ASSEMBLE_VISIBILITY</strong> <em>(tree <var>decl</var>, int <var>visibility</var>)</em></dt> +<dd><p>This target hook is a function to output to <var>asm_out_file</var> some +commands that will make the symbol(s) associated with <var>decl</var> have +hidden, protected or internal visibility as specified by <var>visibility</var>. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fWEAK_005fNOT_005fIN_005fARCHIVE_005fTOC"></a>Macro: <strong>TARGET_WEAK_NOT_IN_ARCHIVE_TOC</strong></dt> +<dd><p>A C expression that evaluates to true if the target’s linker expects +that weak symbols do not appear in a static archive’s table of contents. +The default is <code>0</code>. +</p> +<p>Leaving weak symbols out of an archive’s table of contents means that, +if a symbol will only have a definition in one translation unit and +will have undefined references from other translation units, that +symbol should not be weak. Defining this macro to be nonzero will +thus have the effect that certain symbols that would normally be weak +(explicit template instantiations, and vtables for polymorphic classes +with noninline key methods) will instead be nonweak. +</p> +<p>The C++ ABI requires this macro to be zero. Define this macro for +targets where full C++ ABI compliance is impossible and where linker +restrictions require weak symbols to be left out of a static archive’s +table of contents. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fEXTERNAL"></a>Macro: <strong>ASM_OUTPUT_EXTERNAL</strong> <em>(<var>stream</var>, <var>decl</var>, <var>name</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> any text necessary for declaring the name of an external +symbol named <var>name</var> which is referenced in this compilation but +not defined. The value of <var>decl</var> is the tree node for the +declaration. +</p> +<p>This macro need not be defined if it does not need to output anything. +The GNU assembler and most Unix assemblers don’t require anything. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fEXTERNAL_005fLIBCALL"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_EXTERNAL_LIBCALL</strong> <em>(rtx <var>symref</var>)</em></dt> +<dd><p>This target hook is a function to output to <var>asm_out_file</var> an assembler +pseudo-op to declare a library function name external. The name of the +library function is given by <var>symref</var>, which is a <code>symbol_ref</code>. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fMARK_005fDECL_005fPRESERVED"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_MARK_DECL_PRESERVED</strong> <em>(const char *<var>symbol</var>)</em></dt> +<dd><p>This target hook is a function to output to <var>asm_out_file</var> an assembler +directive to annotate <var>symbol</var> as used. The Darwin target uses the +.no_dead_code_strip directive. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fLABELREF"></a>Macro: <strong>ASM_OUTPUT_LABELREF</strong> <em>(<var>stream</var>, <var>name</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output to the stdio stream +<var>stream</var> a reference in assembler syntax to a label named +<var>name</var>. This should add ‘<samp>_</samp>’ to the front of the name, if that +is customary on your operating system, as it is in most Berkeley Unix +systems. This macro is used in <code>assemble_name</code>. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fMANGLE_005fASSEMBLER_005fNAME"></a>Target Hook: <em>tree</em> <strong>TARGET_MANGLE_ASSEMBLER_NAME</strong> <em>(const char *<var>name</var>)</em></dt> +<dd><p>Given a symbol <var>name</var>, perform same mangling as <code>varasm.cc</code>’s +<code>assemble_name</code>, but in memory rather than to a file stream, returning +result as an <code>IDENTIFIER_NODE</code>. Required for correct LTO symtabs. The +default implementation calls the <code>TARGET_STRIP_NAME_ENCODING</code> hook and +then prepends the <code>USER_LABEL_PREFIX</code>, if any. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fSYMBOL_005fREF"></a>Macro: <strong>ASM_OUTPUT_SYMBOL_REF</strong> <em>(<var>stream</var>, <var>sym</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output a reference to +<code>SYMBOL_REF</code> <var>sym</var>. If not defined, <code>assemble_name</code> +will be used to output the name of the symbol. This macro may be used +to modify the way a symbol is referenced depending on information +encoded by <code>TARGET_ENCODE_SECTION_INFO</code>. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fLABEL_005fREF"></a>Macro: <strong>ASM_OUTPUT_LABEL_REF</strong> <em>(<var>stream</var>, <var>buf</var>)</em></dt> +<dd><p>A C statement (sans semicolon) to output a reference to <var>buf</var>, the +result of <code>ASM_GENERATE_INTERNAL_LABEL</code>. If not defined, +<code>assemble_name</code> will be used to output the name of the symbol. +This macro is not used by <code>output_asm_label</code>, or the <code>%l</code> +specifier that calls it; the intention is that this macro should be set +when it is necessary to output a label differently when its address is +being taken. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fASM_005fINTERNAL_005fLABEL"></a>Target Hook: <em>void</em> <strong>TARGET_ASM_INTERNAL_LABEL</strong> <em>(FILE *<var>stream</var>, const char *<var>prefix</var>, unsigned long <var>labelno</var>)</em></dt> +<dd><p>A function to output to the stdio stream <var>stream</var> a label whose +name is made from the string <var>prefix</var> and the number <var>labelno</var>. +</p> +<p>It is absolutely essential that these labels be distinct from the labels +used for user-level functions and variables. Otherwise, certain programs +will have name conflicts with internal labels. +</p> +<p>It is desirable to exclude internal labels from the symbol table of the +object file. Most assemblers have a naming convention for labels that +should be excluded; on many systems, the letter ‘<samp>L</samp>’ at the +beginning of a label has this effect. You should find out what +convention your system uses, and follow it. +</p> +<p>The default version of this function utilizes <code>ASM_GENERATE_INTERNAL_LABEL</code>. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fDEBUG_005fLABEL"></a>Macro: <strong>ASM_OUTPUT_DEBUG_LABEL</strong> <em>(<var>stream</var>, <var>prefix</var>, <var>num</var>)</em></dt> +<dd><p>A C statement to output to the stdio stream <var>stream</var> a debug info +label whose name is made from the string <var>prefix</var> and the number +<var>num</var>. This is useful for VLIW targets, where debug info labels +may need to be treated differently than branch target labels. On some +systems, branch target labels must be at the beginning of instruction +bundles, but debug info labels can occur in the middle of instruction +bundles. +</p> +<p>If this macro is not defined, then <code>(*targetm.asm_out.internal_label)</code> will be +used. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fGENERATE_005fINTERNAL_005fLABEL"></a>Macro: <strong>ASM_GENERATE_INTERNAL_LABEL</strong> <em>(<var>string</var>, <var>prefix</var>, <var>num</var>)</em></dt> +<dd><p>A C statement to store into the string <var>string</var> a label whose name +is made from the string <var>prefix</var> and the number <var>num</var>. +</p> +<p>This string, when output subsequently by <code>assemble_name</code>, should +produce the output that <code>(*targetm.asm_out.internal_label)</code> would produce +with the same <var>prefix</var> and <var>num</var>. +</p> +<p>If the string begins with ‘<samp>*</samp>’, then <code>assemble_name</code> will +output the rest of the string unchanged. It is often convenient for +<code>ASM_GENERATE_INTERNAL_LABEL</code> to use ‘<samp>*</samp>’ in this way. If the +string doesn’t start with ‘<samp>*</samp>’, then <code>ASM_OUTPUT_LABELREF</code> gets +to output the string, and may change it. (Of course, +<code>ASM_OUTPUT_LABELREF</code> is also part of your machine description, so +you should know what it does on your machine.) +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fFORMAT_005fPRIVATE_005fNAME"></a>Macro: <strong>ASM_FORMAT_PRIVATE_NAME</strong> <em>(<var>outvar</var>, <var>name</var>, <var>number</var>)</em></dt> +<dd><p>A C expression to assign to <var>outvar</var> (which is a variable of type +<code>char *</code>) a newly allocated string made from the string +<var>name</var> and the number <var>number</var>, with some suitable punctuation +added. Use <code>alloca</code> to get space for the string. +</p> +<p>The string will be used as an argument to <code>ASM_OUTPUT_LABELREF</code> to +produce an assembler label for an internal static variable whose name is +<var>name</var>. Therefore, the string must be such as to result in valid +assembler code. The argument <var>number</var> is different each time this +macro is executed; it prevents conflicts between similarly-named +internal static variables in different scopes. +</p> +<p>Ideally this string should not be a valid C identifier, to prevent any +conflict with the user’s own symbols. Most assemblers allow periods +or percent signs in assembler symbols; putting at least one of these +between the name and the number will suffice. +</p> +<p>If this macro is not defined, a default definition will be provided +which is correct for most systems. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fDEF"></a>Macro: <strong>ASM_OUTPUT_DEF</strong> <em>(<var>stream</var>, <var>name</var>, <var>value</var>)</em></dt> +<dd><p>A C statement to output to the stdio stream <var>stream</var> assembler code +which defines (equates) the symbol <var>name</var> to have the value <var>value</var>. +</p> +<a name="index-SET_005fASM_005fOP"></a> +<p>If <code>SET_ASM_OP</code> is defined, a default definition is provided which is +correct for most systems. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fDEF_005fFROM_005fDECLS"></a>Macro: <strong>ASM_OUTPUT_DEF_FROM_DECLS</strong> <em>(<var>stream</var>, <var>decl_of_name</var>, <var>decl_of_value</var>)</em></dt> +<dd><p>A C statement to output to the stdio stream <var>stream</var> assembler code +which defines (equates) the symbol whose tree node is <var>decl_of_name</var> +to have the value of the tree node <var>decl_of_value</var>. This macro will +be used in preference to ‘<samp>ASM_OUTPUT_DEF</samp>’ if it is defined and if +the tree nodes are available. +</p> +<a name="index-SET_005fASM_005fOP-1"></a> +<p>If <code>SET_ASM_OP</code> is defined, a default definition is provided which is +correct for most systems. +</p></dd></dl> + +<dl> +<dt><a name="index-TARGET_005fDEFERRED_005fOUTPUT_005fDEFS"></a>Macro: <strong>TARGET_DEFERRED_OUTPUT_DEFS</strong> <em>(<var>decl_of_name</var>, <var>decl_of_value</var>)</em></dt> +<dd><p>A C statement that evaluates to true if the assembler code which defines +(equates) the symbol whose tree node is <var>decl_of_name</var> to have the value +of the tree node <var>decl_of_value</var> should be emitted near the end of the +current compilation unit. The default is to not defer output of defines. +This macro affects defines output by ‘<samp>ASM_OUTPUT_DEF</samp>’ and +‘<samp>ASM_OUTPUT_DEF_FROM_DECLS</samp>’. +</p></dd></dl> + +<dl> +<dt><a name="index-ASM_005fOUTPUT_005fWEAK_005fALIAS"></a>Macro: <strong>ASM_OUTPUT_WEAK_ALIAS</strong> <em>(<var>stream</var>, <var>name</var>, <var>value</var>)</em></dt> +<dd><p>A C statement to output to the stdio stream <var>stream</var> assembler code +which defines (equates) the weak symbol <var>name</var> to have the value +<var>value</var>. If <var>value</var> is <code>NULL</code>, it defines <var>name</var> as +an undefined weak symbol. +</p> +<p>Define this macro if the target only supports weak aliases; define +<code>ASM_OUTPUT_DEF</code> instead if possible. +</p></dd></dl> + +<dl> +<dt><a name="index-OBJC_005fGEN_005fMETHOD_005fLABEL"></a>Macro: <strong>OBJC_GEN_METHOD_LABEL</strong> <em>(<var>buf</var>, <var>is_inst</var>, <var>class_name</var>, <var>cat_name</var>, <var>sel_name</var>)</em></dt> +<dd><p>Define this macro to override the default assembler names used for +Objective-C methods. +</p> +<p>The default name is a unique method number followed by the name of the +class (e.g. ‘<samp>_1_Foo</samp>’). For methods in categories, the name of +the category is also included in the assembler name (e.g. +‘<samp>_1_Foo_Bar</samp>’). +</p> +<p>These names are safe on most systems, but make debugging difficult since +the method’s selector is not present in the name. Therefore, particular +systems define other ways of computing names. +</p> +<p><var>buf</var> is an expression of type <code>char *</code> which gives you a +buffer in which to store the name; its length is as long as +<var>class_name</var>, <var>cat_name</var> and <var>sel_name</var> put together, plus +50 characters extra. +</p> +<p>The argument <var>is_inst</var> specifies whether the method is an instance +method or a class method; <var>class_name</var> is the name of the class; +<var>cat_name</var> is the name of the category (or <code>NULL</code> if the method is not +in a category); and <var>sel_name</var> is the name of the selector. +</p> +<p>On systems where the assembler can handle quoted names, you can use this +macro to provide more human-readable names. +</p></dd></dl> + +<hr> +<div class="header"> +<p> +Next: <a href="Initialization.html#Initialization" accesskey="n" rel="next">Initialization</a>, Previous: <a href="Uninitialized-Data.html#Uninitialized-Data" accesskey="p" rel="previous">Uninitialized Data</a>, Up: <a href="Assembler-Format.html#Assembler-Format" accesskey="u" rel="up">Assembler Format</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p> +</div> + + + +</body> +</html> |