Compiler Reference Guide

Technical Support

On-Line Manuals

Compiler Reference Guide

Conventions and Feedback Introduction Compiler Command-line Options Language Extensions Compiler-specific Features Keywords and operators __align __alignof__ __ALIGNOF__ __asm __forceinline __global_reg __inline __int64 __INTADDR__ __irq __packed __pure __smc __softfp __svc __svc_indirect __svc_indirect_r7 __value_in_regs __weak __writeonly __declspec attributes __declspec(dllexport) __declspec(dllimport) __declspec(noinline) __declspec(noreturn) __declspec(nothrow) __declspec(notshared) __declspec(thread) Function attributes __attribute__((alias)) function attribute __attribute__((always_inline)) function attribute __attribute__((const)) function attribute __attribute__((constructor[(priority)])) function __attribute__((deprecated)) function attribute __attribute__((destructor[(priority)])) function a __attribute__((format_arg(string-index))) function __attribute__((malloc)) function attribute __attribute__((noinline)) function attribute __attribute__((nomerge)) function attribute __attribute__((nonnull)) function attribute __attribute__((noreturn)) function attribute __attribute__((notailcall)) function attribute __attribute__((pcs("calling_convention") __attribute__((pure)) function attribute __attribute__((section("name"))) functio __attribute__((unused)) function attribute __attribute__((used)) function attribute __attribute__((visibility("visibility_type&qu __attribute__((weak)) function attribute __attribute__((weakref("target"))) funct Type attributes __attribute__((bitband)) type attribute __attribute__((aligned)) type attribute __attribute((packed)) type attribute Variable attributes __attribute__((alias)) variable attribute __attribute__((at(address))) variable attribute __attribute__((aligned)) variable attribute __attribute__((deprecated)) variable attribute __attribute__((noinline)) constant variable attrib __attribute__((packed)) variable attribute __attribute__((section("name"))) variabl __attribute__((unused)) variable attribute __attribute__((used)) variable attribute __attribute__((visibility("visibility_type&qu __attribute__((weak)) variable attribute __attribute__((weakref("target"))) varia __attribute__((zero_init)) variable attribute Pragmas #pragma anon_unions, #pragma no_anon_unions #pragma arm #pragma arm section [section_type_list] #pragma diag_default tag[,tag,...] #pragma diag_error tag[,tag,...] #pragma diag_remark tag[,tag,...] #pragma diag_suppress tag[,tag,...] #pragma diag_warning tag[, tag, ...] #pragma exceptions_unwind, #pragma no_exceptions_u #pragma hdrstop #pragma import symbol_name #pragma import(__use_full_stdio) #pragma import(__use_smaller_memcpy) #pragma inline, #pragma no_inline #pragma no_pch #pragma Onum #pragma once #pragma Ospace #pragma Otime #pragma pack(n) #pragma pop #pragma push #pragma softfp_linkage, #pragma no_softfp_linkage #pragma unroll [(n)] #pragma unroll_completely #pragma thumb #pragma weak symbol, #pragma weak symbol1 = symbol Instruction intrinsics __breakpoint intrinsic __cdp intrinsic __clrex intrinsic __clz intrinsic __current_pc intrinsic __current_sp intrinsic __disable_fiq intrinsic __disable_irq intrinsic __enable_fiq intrinsic __enable_irq intrinsic __fabs intrinsic __fabsf intrinsic __force_stores intrinsic __ldrex intrinsic __ldrexd intrinsic __ldrt intrinsic __memory_changed intrinsic __nop __pld intrinsic __pldw intrinsic __pli intrinsic __promise intrinsic __qadd intrinsic __qdbl intrinsic __qsub intrinsic __rbit intrinsic __rev intrinsic __return_address intrinsic __ror intrinsic __schedule_barrier intrinsic __semihost intrinsic __sev intrinsic __sqrt intrinsic __sqrtf intrinsic __ssat intrinsic __strex intrinsic __strexd intrinsic __strt intrinsic __swp intrinsic __usat intrinsic __wfe intrinsic __wfi intrinsic __yield intrinsic ARMv6 SIMD intrinsics See also ETSI basic operations Example See also C55x intrinsics Example See also VFP status intrinsic __vfp_status intrinsic Fused Multiply Add (FMA) intrinsics Named register variables Syntax Usage Examples See also Compiler predefines Predefined macros Function names C and C++ Implementation Details ARMv6 SIMD Instruction Intrinsics Via File Syntax Summary Table of GNU Language Extensions Standard C Implementation Definition Standard C++ Implementation Definition C and C++ Compiler Implementation Limits

__global_reg

__global_reg

The __global_reg storage class specifier allocates the declared variable to a global variable register.

Show/hideSyntax

__global_reg(n) type varName

Where:

n

Is an integer between one and eight.

type

Is one of the following types:

  • any integer type, except long long

  • any char type

  • any pointer type.

varName

Is the name of a variable.

Show/hideRestrictions

If you use this storage class, you cannot use any additional storage class such as extern, static, or typedef.

In C, global register variables cannot be qualified or initialized at declaration. In C++, any initialization is treated as a dynamic initialization.

The number of available registers varies depending on the variant of the AAPCS being used, there are between five and seven registers available for use as global variable registers.

In practice, it is recommended that you do not use more than:

  • three global register variables in ARM or Thumb-2

  • one global register variable in Thumb-1

  • half the number of available floating-point registers as global floating-point register variables.

If you declare too many global variables, code size increases significantly. In some cases, your program might not compile.

Caution

You must take care when using global register variables because:

  • There is no check at link time to ensure that direct calls between different compilation units are sensible. If possible, define global register variables used in a program in each compilation unit of the program. In general, it is best to place the definition in a global header file. You must set up the value in the global register early in your code, before the register is used.

  • A global register variable maps to a callee-saved register, so its value is saved and restored across a call to a function in a compilation unit that does not use it as a global register variable, such as a library function.

  • Calls back into a compilation unit that uses a global register variable are dangerous. For example, if a function using a global register is called from a compilation unit that does not declare the global register variable, the function reads the wrong values from its supposed global register variables.

  • This storage class can only be used at file scope.

Show/hideExample

Example 5 declares a global variable register allocated to r5.

Example 5. Declaring a global integer register variable

__global_reg(2) int x; v2 is the synonym for r5

Example 6 produces an error because global registers must be specified in all declarations of the same variable.

Example 6.  Global register - declaration error

int x;
__global_reg(1) int x; // error

In C, __global_reg variables cannot be initialized at definition. Example 7 produces an error in C, but not in C++.

Example 7. Global register - initialization error

__global_reg(1) int x=1; // error in C, OK in C++

Copyright © 2007-2008, 2011 ARM. All rights reserved.ARM DUI 0376C
Non-ConfidentialID061811