Developer Guide and Reference

ID 767251
Date 10/31/2024
Public
Document Table of Contents

ATTRIBUTES Directive Properties

Standard Fortran provides a syntax for interoperating with C, including applying the appropriate naming conventions. You should use BIND(C) for interoperability with C, instead of specifying ATTRIBUTES properties. Do not specify both BIND(C) and ATTRIBUTES C for the same procedure. Specifying ATTRIBUTES STDCALL has no effect if BIND(C) is also specified for the same procedure.

The ATTRIBUTES properties C, STDCALL (Windows only), REFERENCE, and VALUE affect the calling convention of routines. You can specify:

  • The C and STDCALL properties for an entire routine.

  • The VALUE and REFERENCE properties for individual arguments.

By default, Fortran passes all data by reference (except the hidden length argument of strings, which is passed by value). If the C (or STDCALL) property is used, the default changes to passing almost all data except arrays by value. However, in addition to the calling-convention properties C and STDCALL, you can specify properties VALUE and REFERENCE to pass arguments by value or by reference, regardless of the calling convention option. Arrays can only be passed by reference.

Different Fortran calling conventions can be specified by declaring the Fortran procedure to have certain attributes.

The following table summarizes the effect of the most common Fortran calling convention directives.

Argument

Default

C or STDCALL

C, REFERENCE or STDCALL, REFERENCE

Scalar

Reference

Value

Reference

Scalar [value]

Value

Value

Value

Scalar [reference]

Reference

Reference

Reference

String

Reference, either Len:End or Len:Mixed

String(1:1)

Reference, either Len:End or Len:Mixed

String [value]

Error

String(1:1)

String(1:1)

String [reference]

Reference, either No Len or Len:Mixed

Reference, No Len

Reference, No Len

Array

Reference

Reference

Reference

Array [value]

Error

Error

Error

Array [reference]

Reference

Reference

Reference

Derived Type

Reference

Value, size dependent

Reference

Derived Type [value]

Value, size dependent

Value, size dependent

Value, size dependent

Derived Type [reference]

Reference

Reference

Reference

F90 Pointer

Descriptor

Descriptor

Descriptor

F90 Pointer [value]

Error

Error

Error

F90 Pointer [reference]

Descriptor

Descriptor

Descriptor

The naming conventions are shown in the following table.

Argument

Default

C or STDCALL

C, REFERENCE or STDCALL, REFERENCE

Prefix

none

none

none

Suffix

none (Windows)

_ (Linux)

none

none

Case

Upper Case (Windows)

Lower Case (Linux)

Lower Case

Lower Case

Stack Cleanup

Caller

Caller

Caller

The terms in the previous tables mean the following:

Term Term Meaning

[value]

Argument assigned the VALUE attribute.

[reference]

Argument assigned the REFERENCE attribute.

Value

The argument value is pushed to the stack. All values are padded to the next 4-byte boundary.

Reference

The 8-byte argument address is pushed to the stack.

Len:End or Len:Mixed

For certain string arguments:

  • Len:End applies when -nomixed-str-len-arg (Linux) or /iface:nomixed_str_len_arg (Windows) is set. The length of the string is pushed (by value) on the stack after all of the other arguments. This is the default.

  • Len:Mixed applies when -mixed-str-len-arg (Linux) or /iface:mixed_str_len_arg (Windows) is set. The length of the string is pushed (by value) on the stack immediately after the address of the beginning of the string.

No Len or Len:Mixed

For certain string arguments:

  • No Len applies when -nomixed-str-len-arg (Linux) or /iface:nomixed_str_len_arg (Windows) is set. The length of the string is not available to the called procedure. This is the default.

  • Len:Mixed applies when -mixed-str-len-arg (Linux) or /iface:mixed_str_len_arg (Windows) is set. The length of the string is pushed (by value) on the stack immediately after the address of the beginning of the string.

No Len

For string arguments, the length of the string is not available to the called procedure.

String(1:1)

For string arguments, the first character is converted to INTEGER(4) as in ICHAR(string(1:1)) and pushed to the stack by value.

Error

Produces a compiler error.

Descriptor

The 8-byte argument address of the array descriptor.

Size dependent

Linux

  • Arguments from 1 to 8 bytes are passed by register.

  • Arguments from 9 to 16 bytes are passed in two registers.

  • Arguments more the 16 bytes provide value semantics by passing a temporary storage address by register.

Windows

  • Arguments from 1 to 8 bytes are passed by register.

  • Arguments greater than 8 bytes provide value semantics by passing a temporary storage address by reference.

Upper Case

Procedure name in all uppercase.

Lower Case

Procedure name in all lowercase.

Callee

The procedure being called is responsible for removing arguments from the stack before returning to the caller.

Caller

The procedure doing the call is responsible for removing arguments from the stack after the call is over.

You can use the BIND attribute to resolve discrepancies with C. Alternatively, the ALIAS property can be used with any other Fortran calling-convention option to preserve mixed-case names.

On Windows, the compiler option /iface also establishes some default argument passing conventions. Option /iface has the following choices:

Option

Argument Is Passed By

Who Cleans the Stack?

Varargs Support?

/iface:cref

By reference

Caller

Yes

/iface:stdref

By reference

Callee

No

/iface:default

By reference

Caller

Yes

/iface:c

By value

Caller

Yes

/iface:stdcall

By value

Callee

No

/iface:cvf

By reference

Callee

No

NOTE:

On Windows, when interfacing to the Windows GUI or making API calls, you will typically use STDCALL.