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

    <tr>
        <th>Summary</th>
        <td>
            Invalid BTF produced with IPO globalopts pass
        </td>
    </tr>

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

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

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

<pre>
    Consider the following minimal example (https://godbolt.org/z/YqbTb1znd):

```
// bpf.c
static int foo;

void init() {
    foo = 1000;
}

int get() {
    return foo;
}
```

When it is compiled with `globalopts` pass enabled (`clang -g -c bpf.c -O1 -target bpf`), `foo` converts to one-byte bool 
https://github.com/llvm/llvm-project/blob/148111fdcf0e807fe74274b18fcf65c4cff45d63/llvm/lib/Transforms/IPO/GlobalOpt.cpp#L1160
and its new size propagates through all of meta information, including BTF.
Verifier rejects such BTF after checking entry size inside `DATASEC` against referred type size.

I believe that this is not intended behavior for BTF, but not so sure about generated DWARF/symtab.

```
$ bpftool btf dump file ./result/bpf.o
[1] FUNC_PROTO '(anon)' ret_type_id=0 vlen=0
[2] FUNC 'init' type_id=1 linkage=global
[3] FUNC_PROTO '(anon)' ret_type_id=4 vlen=0
[4] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
[5] FUNC 'get' type_id=3 linkage=global
[6] VAR 'foo' type_id=4, linkage=static
[7] DATASEC '.bss' size=0 vlen=1
        type_id=6 offset=0 size=1 (VAR 'foo')
```

```
$ readelf --syms ./result/bpf.o 

Symbol table '.symtab' contains 14 entries:
   Num:    Value          Size Type    Bind Vis      Ndx Name
...
     3: 0000000000000000     1 OBJECT  LOCAL  DEFAULT 4 foo
...
```

```
$ llvm-dwarfdump ./result/bpf.o
...
0x00000023: DW_TAG_variable
                DW_AT_name      ("foo")
 DW_AT_type     (0x00000037 "int")
 DW_AT_decl_file        ("/build/source/bpf.c")
 DW_AT_decl_line        (1)
                DW_AT_location  (DW_OP_addrx 0x0, DW_OP_deref_size 0x1, DW_OP_constu 0x3e8, DW_OP_mul, DW_OP_lit0, DW_OP_plus, DW_OP_stack_value)
...
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVl1v4zoO_TXKC5FAluN8POQhrZtBF0VTTHNb7FMgW3SiHUXySnLazK9fUE4nmd4uLsYI0FrioQ7JQ8oyBL2ziAtW3LCiHMgu7p1fyJPBMKicOi1unQ1aoYe4R2icMe5N2x0ctNUHaQDf5aE1CEzM9jG2geVLJlZMrHZOVc7EkfM7JlY_mVj9-7_Vpsp-WsXEnMx4-k34-cfPQKjaZlQzvgxRRl2DthEa51h-0yOOTivQVkcmZkzMgU1pAwDIClheQsY5P5tPyx5ETnb4d4jH2Hl75b8HXJPiy9c9WtARdIDaHVptUMGbjntgE74zrpLGtTGwCYdWhgBoZUUmdNiE10baHQx3MKz7yGC4zmAYpd9hpBU6RsyZuCV3RGTCoXb2iD4GiA6cxWF1igiVcwYYX37Ks477rhrV7sDEypjjx59h691_sI5MrCrjKiZW2XiWZVmj6objjE8bnI7FdFxls6ZuJkU9rptmXKhJfuVHE27jpQ2N84fAxOr-ac3E6luKet3GUd22TOQPWZaSJa0CHQNYfIOgfyK03rVyJyMGiHvvut0epDHgGjhglKAt-ZVRO0sJ0LY2nSJ53WxWI8aXL-h1o9GDR4olQOjqPW2CbCJ6qPdY_yB7tNGf-iN10isls1xuls93t5RQuZPahggeG_QeFcRTi8l-1Nf4Hio0Go8IcS8jxL0OVG_rIgkQrUIFFe7lUTsPjfNEgihXXUxGwUHoPIKsXEdSs-hlRAXl6_I7lSmcDlFWo69EPyYVRCpuFRtQ3aGFRhuEERMrj6EzqYZtM3JkXtxkrChh9dfj7fbp-3qzBiamTMykpRzOmZiSqLcU31YrlpccjgYt_dPDxQecgH0fTeFinoHR9ofcIcvLXtw9LP-zU8efTh0T_P5x0x-azqTsJ8tKx7B1TRMwJr7Wb2mJ5WUuAG3tSBIsL5_vvz3elb2_4jqK1NnXQeT_J4gJoV6W3wlErfYbaEz1vOD68dPjpoQ7y4mwoyqEqxB-pThL9Z1ffE7gKq6zdUaT4TcSlMG_TZ3PIvEoFZoGhsNwOoQv1AE97vl0qJyBSEMoce2lR3RrZyP1AWTj1DEaQz-IAeCxO7A8zcQXaTqEX88zNdWG2gUAbrRV8KJDv_Wo3uFRHpDx5Wg0Oo9UyMkP__SknQzWN_-6u90APKxvlw8A5d1q-dfDBsZpAn94-YdEpOmm3qRvUq982Sa9I_7eHy4SpfJ1u1l-2x6l15SbD7pXT_m6XW62NkU0T3eFSAUSfYHO-1Tdfv_Dfz4FJkSS9e-mCmuzpWb-5Y84dtooGgmu8zWeSddfQo22Z2h23vySsXF1P0OTafm6XT9tpVL-Hfg7J1X3Swo9Nts0JPl7dlmvnQ2xA_6e4-yyeujM5cXoeOWoNV24vIUo6x_bI6mmJ_mpigO1yNU8n8sBLrLpmBe8mM_zwX4xnYhsgpJnmEk1yfNaZPOimIhMzHKZ8WqgF4KLggtRZNMiz8QoV9m8kChmk0xVWdOwMceD1GZEmqBPjYEOocNFJmbT8XxgZIUmpG8bIehOSruU6aIc-EUSUtXtAhtzo0MMFzdRR4OLe3uURqt04bTeqa7-uPnvn9ZwufrTvT_ovFn88d2cGNHFeqZ8XIj_BQAA__81ydbu">