<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/140514>140514</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            dot does not advance as expected in linker script
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          shuffle2
      </td>
    </tr>
</table>

<pre>
    (Apologies for the vague title, there's probably a better description that should be used for someone more familiar with lld internals)

Consider this dummy code and linker script:
```c
int a() { return 1; }
int b() { return 2; }
int c() { return 3; }
const char * d() { return "d"; }
void _start() {
    a();
    b();
    c();
 d();
}
```

```
MEMORY {
    v : ORIGIN = 0x0000000010000000, LENGTH = 0x80000000
    p : ORIGIN = 0x1000000000000000, LENGTH = 0x80000000
}
SECTIONS {
    va_pad = CONSTANT(MAXPAGESIZE);
    vaddr = ORIGIN(v);
    vaddr += va_pad;
    paddr = ORIGIN(p);
    .a vaddr : AT(paddr) { *(.text.a) } >v
    vaddr += va_pad;
    paddr += SIZEOF(.a);
 .b vaddr : AT(paddr) { *(.text.b); . += va_pad * 3; } >v
    /* on gnu ld, can use "." throughout instead of "vaddr", and don't need to explicitly add SIZEOF(.b) to virt addr here */
    vaddr += SIZEOF(.b) + va_pad;
    paddr += SIZEOF(.b);
    .c vaddr : AT(paddr) { *(.text.c) } >v
    vaddr += va_pad;
    paddr += SIZEOF(.c);
    .d vaddr : AT(paddr) { *(.text.d) } >v
}
```

The idea with the linker script is to have VMA and LMA increase alongside each other, however VMA can skip forward sometimes. The above form of the script works on lld and gnu ld. However, the same script also works on ld if `vaddr` is replaced with `.`. This is advantageous as it adheres to customary understanding of how `.` works in the linker script - as you list output sections, the value of dot increases. On lld, this seems to not be the case.

As example, this form of the script would be preferred (partially because code already exists which is written this way), and results in same output as above on gnu ld, but not lld:
```
SECTIONS {
    va_pad = CONSTANT(MAXPAGESIZE);
    . = ORIGIN(v);
    . += va_pad;
    paddr = ORIGIN(p);
    .a . : AT(paddr) { *(.text.a) } >v
    . += va_pad;
    paddr += SIZEOF(.a);
    .b . : AT(paddr) { *(.text.b); . += va_pad * 3; } >v
    /* on gnu ld, can use "." throughout instead of "vaddr", and don't need to explicitly add SIZEOF(.b) to virt addr here */
    . += va_pad;
    paddr += SIZEOF(.b);
 .c . : AT(paddr) { *(.text.c) } >v
    . += va_pad;
    paddr += SIZEOF(.c);
    .d . : AT(paddr) { *(.text.d) } >v
}
```

Testing with e.g. 
```
clang --target=riscv64-unknown-elf -o test.elf -nostdlib -ffunction-sections -T test.ld test.c -Wl,--print-map && llvm-readelf-21 -Wa test.elf
```
You will notice that on lld, VMA does not advance as expected.

Desired output (first script):
```
Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .a                PROGBITS 0000000010001000 001000 000012 00  AX  0   0  2
  [ 2] .b PROGBITS        0000000010002000 002000 003012 00  AX  0   0  2
  [ 3] .c PROGBITS        0000000010006012 005012 000012 00  AX  0   0  2
 [ 4] .d                PROGBITS        0000000010007012 006012 000018 00  AX 0   0  2
Program Headers:
  Type           Offset   VirtAddr PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x001000 0x0000000010001000 0x1000000000000000 0x000012 0x000012 R E 0x1000
  LOAD 0x002000 0x0000000010002000 0x1000000000000012 0x003012 0x003012 R E 0x1000
  LOAD           0x005012 0x0000000010006012 0x1000000000003024 0x000012 0x000012 R E 0x1000
  LOAD           0x006012 0x0000000010007012 0x1000000000003036 0x000038 0x000038 R E 0x1000
```
actual output (second script, using `.`): 
```
Section Headers:
  [Nr] Name              Type Address          Off    Size   ES Flg Lk Inf Al
  [ 0] NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .a                PROGBITS        0000000010000000 001000 000012 00  AX  0 0  2
  [ 2] .b                PROGBITS        0000000010000012 001012 003012 00  AX  0   0  2
  [ 3] .c                PROGBITS        0000000010003024 004024 000012 00  AX  0   0  2
  [ 4] .d                PROGBITS 0000000010003036 004036 000018 00  AX  0   0  2

Program Headers:
  Type Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x001000 0x0000000010000000 0x1000000000000000 0x000012 0x000012 R E 0x1000
  LOAD           0x001012 0x0000000010000012 0x1000000000000012 0x003012 0x003012 R E 0x1000
  LOAD           0x004024 0x0000000010003024 0x1000000000003024 0x000012 0x000012 R E 0x1000
  LOAD 0x004036 0x0000000010003036 0x1000000000003036 0x000038 0x000038 R E 0x1000
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcmElv4zoSxz8NcylYkCl5ycEHZesXIEujk3nLXB4osWxxmhYFkrKT9-kHJcqLbL-0u3tmDmMkoCwV_yxWFX-kLJxTiwpxxkZXbHRzIRpfGjtzZTOfa-QXuZHvM8anWW20WSh0MDcWfImwEosGwSuvkfFrumWR8YmD2ppc5PodBOToPVqQ6Aqraq9MBb4UHlxpGi0hR2gcylbSmSWaCmFpLMJcLJVWwsJa-RK0lqAqj7YS2jF-yeKMxdm1qZySSM4oB7JZLt-hMBJBVBK0qr6ihTAsS8iejePwV7A4U5UHwfiU8Utgkyuw6BtbwZAlV8AmN51FfmzB-xbFsUWysyhM5TwUpbDAeAby2JhxLhnfE10ZJeFP54X1O2sWZwCwcZglmxv54Y2id0Pufwvy2yCEGO5_fbx9fP7yx95wK2BJBs9f7j_dPwFLbiB-i7vPsGsp8Q-3T59ef-kMppsHQaI-lth0jc-QCD6_3F6_3j8_vey7Jv6shWw7XD8_vbxmT6-MTx-z3z9nn25f7v9524vKSkhpW-PgCePT1SkDfkU2QXv3sD7uXfd6R2I7QgYZOdJ22WSa8YzxaeTxzUci3LwBltyuvmPw8JAm9nxHYmLnQJSfPXoeekHUH62tzU3V7nvG-B09MhUsqga0pFQVoqI1S4UbMc7Bl9Y0i9I0HlTlPAoJZk5PV8ELTp1oRUpTMT7xUCFK8AbwrdaqUJ44IeXe3MhLMlgp66GdGZElTOTuVMwOujJ-dW4Y834ei7MjWfyH8lj0HZBnOyAPHDi5ul9LBCVRBIoSs3tYBOUozqVYIfz6mLVZenjMQFWFReEQhDbVghgLKIoSDCGe0lmaNa7Qtp2oHtxXVRPD18LKluNeLdFFQOOL3KyQHi6pLsiHbvC1sV8d1RbRnYYONRbBL0G921PAieW2j9DO7HWUoObAxnEotXFME7JYa1GgDHNm4ziif3ilPUI5EHIlKi8WaBoHwoGiEqP6akNRNM6bpbDv0FQSrfOikqpakOelWW_UOg9UdSKkAxJ9Nw1o5TyYxteNB4cFbX1uM6WV0A2SqDR-G20XwXMbjGClHDjEZetWZTxtldS1EA6jkN3MAb6JZb3ZfpU7HeZuo60tztFapOU-rYX1Smj9DjkWgtZz2Dm1RSHfAd-U8w7WpSpKitraKu-xCoOsxTtVbbesLbpG-zYabaa6KQvXZb4Hj7zx7WRolsnh_vPTmI8-Qnz0M3iPfhDt3xr0A6xT7_ysgf9_qP694drDd1ScFatT3P7eUY-Yfc7A5_EanSfctOjCaBHBgU2hRbWAwcALu0DPkhurXLEap4Om-lqZdTVAPYeBAY_OR-11ZZyXWuUwmM-bqsXQYIMjGLwGSy1DW8DgN8349WBQW1X5wVLUwPiY8TFovVoOCA6o5wM-hMFvYjvKgZN_mAbWSmta6arAcOA3W7TRpiENuhYELY4LJFzgW42FR9nR7QadIlh1PGF8OlfW-c2JnlJwBJAwL_iF3LQuGACw0dWTZaMbeCI-9T6v73XvTialRed2N57nc2pe1F9kd_sCd3oBD1_hvppDpjfyEJP88efpHw8P-98PTr4xHDadWfiPt_JDko_EofznL8-fru5fX2D_VD4MSsON7pC3utnvW12-1eWtbr4TOvCTRHgQ6prkQ72k1Ss-1BsHhVFo_tY_kktbOfm30z6hPgl64636dKO-J_7ZmoUVy8M6OSiG5_ncoQeAX5X1VBjwuXx37cXuc6c0vqi_AB5x2bZtgWRaLapW8-E52y8MeoEKmXk7ztnRm1FnRVPZXHyB285wJ08P-bEoPyXaaSW9i1OifZ9HOyf6eezJJzFPz_S5Lz8-lp-ckk_GnVUy3V305PdxIArfCL0HEIeFqeSWINfQOKJtd6oLSDkk7g8y5adA8r_Cxon1E39Ej5Ps-C7xVm4YmvNQ8h3yofziNDQfk-9baOnrUt3FaWj2mbKv-w2uHNNkb9T_Flfin-LKofzRGo2P1-gPEybdsaOfzx8lTBDdEqOfzB_nyoWcJfIyuRQXOBtO0sk4TeJhelHOJKZ8lA7jNB_x5DK-lJO0KNJxwVMpcTIcXagZj_koHg0v4ylPkjSS0wQvcSwkH-YTmSNLY1wKpSM6a0XGLi6Ucw3Ohmk8GqYXWuSoXfszLecVrqF9Skfx0c2FnbUHtLxZOJbG9O7pdjLtT7Qzetf86NxFb3C9d9mLxupZ6X3dVjK9NNwtlC-bPCrMkvE70u-aQW3Nv7DwjN-1XjnG7zq3VzP-7wAAAP__ezrnew">