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

    <tr>
        <th>Summary</th>
        <td>
            Invalid order of command-line and built-in macro definitions in .debug_macros
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Using this source file:

```
#define ZERO 0

int main(void) {
    return ZERO + ONE;
}   
```
Compiled with:

```
$ clang --version
Ubuntu clang version 15.0.0-++20220320052914+3b2e605e33bd-1~exp1~20220320173006.195
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ clang -O0 -gdwarf-5 -fdebug-macro test.c -DONE=1
```
We get 

```
$ llvm-dwarfdump-14 -debug-macro a.out
a.out:  file format elf64-x86-64

.debug_macro contents:
0x00000000:
macro header: version = 0x0005, flags = 0x02, format = DWARF32, debug_line_offset = 0x00000000
DW_MACRO_start_file - lineno: 0 filenum: 0
  DW_MACRO_define_strx - lineno: 1 macro: ZERO 0
DW_MACRO_end_file
DW_MACRO_define_strx - lineno: 0 macro: __llvm__ 1
DW_MACRO_define_strx - lineno: 0 macro: __clang__ 1
<snip>
DW_MACRO_define_strx - lineno: 0 macro: __STDC_UTF_16__ 1
DW_MACRO_define_strx - lineno: 0 macro: __STDC_UTF_32__ 1
DW_MACRO_define_strx - lineno: 0 macro: ONE 1
DW_MACRO_define_strx - lineno: 0 macro: __GCC_HAVE_DWARF2_CFI_ASM 1
```

We see that the definition for `ONE` (a macro defined on the command line) is placed after the `DW_MACRO_end_file` leaving the main source file.  That makes the definition not visible from a point somewhere in the main source file.  Same for all the built-in macros (like `__llvm__`).

According to DWARF5 section `6.3.2.4 Entries for Command Line Options`:

> A DWARF producer generates a define or undefine entry for each pre-processor
symbol which is defined or undefined by some means other than such a directive
within the compiled source text. In particular, pre-processor symbol definitions
and undefinitions which occur as a result of command line options (when
invoking the compiler) are represented by their own define and undefine entries.
>
> All such define and undefine entries representing compilation options appear
before the first DW_MACRO_start_file entry for that compilation unit (see
Section 6.3.3 following) and encode the value 0 in their line number operands.

I think that the definition of `ONE` should be placed before the first `DW_MACRO_start_file`.  The paragraph above talks about the macros defined using command line options, but in my opinion the built-in macros should also be placed before the first `DW_MACRO_start_file`.  They fit the ` defined or undefined by some means other than such a directive
within the compiled source text` description.

The goal is that when stopped in the main source file (or any source file it includes) in a debugger, we are able to `print ONE` or `print __llvm__`.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9Vttu4zYQ_Rr5hZCgiyXHD37w2k4boG2ATbYL9EWgpLHNhiIFkrKdv--QlHxJsl0gBWoYvpBzOTwzc6hKNq-Lb5qJHTF7pomWvaqBbBmHIFsG8TqIx88iHt7-b5o1sGUCyF-br48kvjZlwpCWMhGkdwfJmiCdk2D2xe8RfCkwvRLeMUi_kMc_NkE27AezNVp8mHIl2w5xNeTIzP5n6Kak5hRPFYYHUJpJ4Te-Vb0w_bA37JAkj-IoDhEKvtM4TeMsjeM8nSdTXMiqFIo4hyyrmjAJZhs4dfZrNExmWRwXUTLPfYpnqnZgEB853RVlMQ27OuRM9KdwJ_rBZK-ANqSVDXBr2EnNTn7rQWhDOZ5yzZTdCtL7Xiv8rJh4d7bHmIS75kjVNsxJuG2g6ndhS2sliQFtopqEa0fuOvmQpu9AECr5CZGcH9rQZWn6tguTKQmvM9FI9sZb-5-2MnPbQWQrVUsNAb5FGpCNsJhe54pcmNKHqaUwIIw-FzY-xcPrvOQt98gdOHLGAuIBiTPPg3RFtpzu9LiWuhWPwy6tvy-_3mdu1WfH0kApt1sN5hLHp3U519_L35err48l1kWZ0p0rJNZLSIshdsMi-tb9GZv87OWHBJ3V6cYtIe4w9uf1AJ39QDQu15vlH4WLL-HK0hasLEnyGV_XWRfnIFtpwbog23wm2NPzelV-e74vk-KzeM4hsvRzIbD_P5f5l9Wq_HX556Z0LZOWq_uHcvn0O_l4lM4DpQFQSrHbzB6IS8SM7VHsQYLWdhyLGMf6jvpk3gZVDW2sSy3blorGobLKiaLccVqjAd0aUM4GI7xvFIzKgR68lIMT4Gs5jwh5trBa-gL6LTghDTkwzSo7tEq2hKImWRnXsoXjHhQQJn4U9om2btQJ6pazqXrGTYh27oDaHpazFwd7bE7LWzqPrrlb1rVUjYMv_ZjmSGbt8KF5EWVRGk3JRhjF8AQ24Wrg6jd7Dz121lTbyG_uhmxDlj4i6ZRs-hpp3IEARVEl8ajDRYYBezH8RiVSry4H0HqPbhCiaw1aS-Wj6te2kpwc9wz3sUjnMl6iNKR6dQySFqjQRCI5toAUGezRCzMzZU94GMbcXmzs3Ab-shu4NnAyEXkQpEMVYnXPqbIadgOMDJguhdWDLiNHAyi_PMCWdd1j2SwHCnTPDZHbmwYk0pNqS4htIMb7_SBfxj4bgCrbqxT7RAFi0sifPz6aMEXkUYwsX2HxNGMxo3OhriqGzeRY-he_SzKLxiOhrmFG3LTrgA4VqwDrCQ70liltyEfSfim8G-LrmD2SZ4nACfcBn4butK2ZoQ_n8ohAHBOIFkSNF7zLd6C8B5QXX1wkxJGLl0aFDSE77ETR6JtpeLDPY-LlQynBIl2URO9lz5FqGGXi3TGv1eJyUlx1kgC2o-hO0Q4bspIH9KT8RdvfvRlG3k3x2NO9Hsh-1yW2ISt0spP_iouIdxC1t4owgKZcy_-AHOvEzCiI_8cA-jS6Vswd-KZglsmdpNxqgSuanReijcQObH6knradrHCK15tVZjmseY-53BUgnEjh08oO3NQfwY0atXKNYomwOmXVemgJf9P4pSvBjSbNImvm2ZxODDMcFg8C-5JZxhrbhufRD_k4cLd1uxYWC-r6-U1PesUXe2M69wSX3uN7h2z2VYRR8Y-FMXxZxfobace_TOveHvI-n-ZxMdkv0jqGKp3n0zlAkyWzHKbFdl7Esyxp8Dk7m3BaAdeLIP8S5OsJWwyP4fiRxHkSTWkBBcybu1k2vZvOimAaA7LOI5s4kmo3UQuHAZFr3ORMG33ZpFqznQAY49Pe7KVaaNZS9TJxaBcO6j_eST43">