#### 15.21.3 Output of Uninitialized Variables

Each of the macros in this section is used to do the whole job of outputting a single uninitialized variable.

— Macro: ASM_OUTPUT_COMMON (stream, name, size, rounded)

> A C statement (sans semicolon) to output to the stdio stream stream the assembler definition of a common-label named name whose size is size bytes. The variable rounded is the size rounded up to whatever alignment the caller wants.

> Use the expression `assemble_name (`stream`,` name`)` to output the name itself; before and after that, output the additional assembler syntax for defining the name, and a newline.

> This macro controls how the assembler definitions of uninitialized common global variables are output.

— Macro: ASM_OUTPUT_ALIGNED_COMMON (stream, name, size, alignment)

> Like `ASM_OUTPUT_COMMON` except takes the required alignment as a separate, explicit argument. If you define this macro, it is used in place of `ASM_OUTPUT_COMMON`, and gives you more flexibility in handling the required alignment of the variable. The alignment is specified as the number of bits.

— Macro: ASM_OUTPUT_ALIGNED_DECL_COMMON (stream, decl, name, size, alignment)

> Like `ASM_OUTPUT_ALIGNED_COMMON` except that decl of the variable to be output, if there is one, or `NULL_TREE` if there is no corresponding variable. If you define this macro, GCC will use it in place of both `ASM_OUTPUT_COMMON` and `ASM_OUTPUT_ALIGNED_COMMON`. Define this macro when you need to see the variable's decl in order to chose what to output.

— Macro: ASM_OUTPUT_BSS (stream, decl, name, size, rounded)

> A C statement (sans semicolon) to output to the stdio stream stream the assembler definition of uninitialized global decl named name whose size is size bytes. The variable rounded is the size rounded up to whatever alignment the caller wants.

> Try to use function `asm_output_bss` defined in `varasm.c` when defining this macro. If unable, use the expression `assemble_name (`stream`,` name`)` to output the name itself; before and after that, output the additional assembler syntax for defining the name, and a newline.

> There are two ways of handling global BSS. One is to define either this macro or its aligned counterpart, `ASM_OUTPUT_ALIGNED_BSS`. The other is to have `TARGET_ASM_SELECT_SECTION` return a switchable BSS section (see TARGET_HAVE_SWITCHABLE_BSS_SECTIONS). You do not need to do both.

> Some languages do not have `common` data, and require a non-common form of global BSS in order to handle uninitialized globals efficiently. C++ is one example of this. However, if the target does not support global BSS, the front end may choose to make globals common in order to save space in the object file.

— Macro: ASM_OUTPUT_ALIGNED_BSS (stream, decl, name, size, alignment)

> Like `ASM_OUTPUT_BSS` except takes the required alignment as a separate, explicit argument. If you define this macro, it is used in place of `ASM_OUTPUT_BSS`, and gives you more flexibility in handling the required alignment of the variable. The alignment is specified as the number of bits.

> Try to use function `asm_output_aligned_bss` defined in file `varasm.c` when defining this macro.

— Macro: ASM_OUTPUT_LOCAL (stream, name, size, rounded)

> A C statement (sans semicolon) to output to the stdio stream stream the assembler definition of a local-common-label named name whose size is size bytes. The variable rounded is the size rounded up to whatever alignment the caller wants.

> Use the expression `assemble_name (`stream`,` name`)` to output the name itself; before and after that, output the additional assembler syntax for defining the name, and a newline.

> This macro controls how the assembler definitions of uninitialized static variables are output.

— Macro: ASM_OUTPUT_ALIGNED_LOCAL (stream, name, size, alignment)

> Like `ASM_OUTPUT_LOCAL` except takes the required alignment as a separate, explicit argument. If you define this macro, it is used in place of `ASM_OUTPUT_LOCAL`, and gives you more flexibility in handling the required alignment of the variable. The alignment is specified as the number of bits.

— Macro: ASM_OUTPUT_ALIGNED_DECL_LOCAL (stream, decl, name, size, alignment)

> Like `ASM_OUTPUT_ALIGNED_DECL` except that decl of the variable to be output, if there is one, or `NULL_TREE` if there is no corresponding variable. If you define this macro, GCC will use it in place of both `ASM_OUTPUT_DECL` and `ASM_OUTPUT_ALIGNED_DECL`. Define this macro when you need to see the variable's decl in order to chose what to output.