Keil™, An ARM® Company

RealView Compiler Reference Guide

Technical Support

On-Line Manuals

RealView Compiler Reference Guide

Preface 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)) __attribute__((always_inline)) __attribute__((const)) __attribute__((deprecated)) __attribute__((malloc)) __attribute__((noinline)) __attribute__((no_instrument_function)) __attribute__((nomerge)) __attribute__((nonnull)) __attribute__((noreturn)) __attribute__((notailcall)) __attribute__((pure)) __attribute__((section("name"))) __attribute__((unused)) __attribute__((used)) __attribute__((visibility("visibility_type"))) __attribute__((weak)) Type attributes __attribute__((bitband)) __attribute__((aligned)) __attribute((packed)) __attribute__((transparent_union)) Variable attributes __attribute__((alias)) __attribute__((at(address))) __attribute__((aligned)) __attribute__((deprecated)) __attribute__((packed)) __attribute__((section("name"))) __attribute__((transparent_union)) __attribute__((unused)) __attribute__((used)) __attribute__((visibility("visibility_type"))) __attribute__((weak)) __attribute__((zero_init)) Pragmas #pragma anon_unions, #pragma no_anon_unions #pragma arm #pragma arm section [section_sort_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 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 Instruction intrinsics __breakpoint __cdp __clrex __clz __current_pc __current_sp __disable_fiq __disable_irq __enable_fiq __enable_irq __fabs __fabsf __force_stores __ldrex __ldrexd __ldrt __memory_changed __nop __pld __pli __qadd __qdbl __qsub __rbit __rev __return_address __ror __schedule_barrier __sev __sqrt __sqrtf __ssat __strex __strexd __strt __swp __usat __wfe __wfi __yield ARMv6 SIMD intrinsics ETSI basic operations C55x intrinsics Named register variables VFP status intrinsic __vfp_status GNU builtin functions Nonstandard functions C99 functions C99 functions in the C90 reserved namespace C94 functions C90 functions C99 floating-point functions Other builtin functions Compiler predefines Predefined macros Function names C and C++ Implementation Details Via File Syntax Standard C Implementation Definition Standard C++ Implementation Definition C and C++ Compiler Implementation Limits

__svc

4.1.15. __svc

The __svc keyword declares a SuperVisor Call (SVC) function taking up to four integer-like arguments and returning up to four results in a value_in_regs structure.

__svc is a function qualifier. It affects the type of a function.

Syntax

__svc(int svc_num) return-type function-name([argument-list]);

Where:

svc_num

Is the immediate value used in the SVC instruction.

It is an expression evaluating to an integer in the range:

  • 0 to 224–1 (a 24-bit value) in an ARM instruction

  • 0-255 (an 8-bit value) in a 16-bit Thumb instruction.

Usage

This causes function invocations to be compiled inline as an AAPCS-compliant operation that behaves similarly to a normal call to a function.

The __value_in_regs qualifier can be used to specify that a small structure of up to 16 bytes is returned in registers, rather than by the usual structure-passing mechanism defined in the AAPCS.

Example

__svc(42) void terminate_1(int procnum); // terminate_1 returns no results
__svc(42) int terminate_2(int procnum);  // terminate_2 returns one result
typedef struct res_type
{
    int res_1;
    int res_2;
    int res_3;
    int res_4;
} res_type;
__svc(42) __value_in_regs res_type terminate_3(int procnum);
                                         // terminate_3 returns more than
                                         // one result

Errors

When an ARM architecture variant or ARM architecture-based processor that does not support an SVC instruction is implied on the command line using the --device option, the compiler generates an error.

See also

Copyright © 2007, 2008 ARM Limited. All rights reserved.ARM DUI 0376B
Non-ConfidentialUnrestricted Access