Search code examples
carraysassemblygccvariable-length-array

How does GCC implement variable-length arrays?


How does GCC implement Variable-length arrays (VLAs)? Are such arrays essentially pointers to the dynamically allocated storage such as returned by alloca?

The other alternative I could think of, is that such an array is allocated as last variable in a function, so that the offset of the variables are known during compile-time. However, the offset of a second VLA would then again not be known during compile-time.


Solution

  • Here's the allocation code (x86 - the x64 code is similar) for the following example line taken from some GCC docs for VLA support:

    char str[strlen (s1) + strlen (s2) + 1];
    

    where the calculation for strlen (s1) + strlen (s2) + 1 is in eax (GCC MinGW 4.8.1 - no optimizations):

    mov edx, eax
    sub edx, 1
    mov DWORD PTR [ebp-12], edx
    mov edx, 16
    sub edx, 1
    add eax, edx
    mov ecx, 16
    mov edx, 0
    div ecx
    imul    eax, eax, 16
    call    ___chkstk_ms
    sub esp, eax
    lea eax, [esp+8]
    add eax, 0
    mov DWORD PTR [ebp-16], eax
    

    So it looks to be essentially alloca().