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

    <tr>
        <th>Summary</th>
        <td>
            llvm-dis: fail to generate a named struct that is only used by metadata of a global
        </td>
    </tr>

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

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

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

<pre>
    When a named type is only used by some values in a metadata of a global, the named type may not be printed out by `llvm-dis`.

Steps:
1. Download and unzip [test.zip](https://github.com/llvm/llvm-project/files/10231558/test.zip)
2. Run `llvm-dis test.bc` and you will get the following output:

```llvm
; ModuleID = 'test.bc'
source_filename = "Foo"

@g = external global i8, !test.meta !0

!0 = !{%Bar undef}
```
3. The named struct type `Bar` is not included in `test.ll`. We cannot generate `test.bc` back from `test.ll` by using `llvm-as`.


The test input (`test.bc`) can be generated by the following program.

```c
#include <llvm-c/Core.h>
#include <llvm-c/BitWriter.h>

int main() {
  LLVMContextRef context = LLVMContextCreate();
  LLVMModuleRef  module = LLVMModuleCreateWithNameInContext("Foo", context);
  LLVMBuilderRef builder = LLVMCreateBuilderInContext(context);

  // create a named type
  LLVMTypeRef type = LLVMStructCreateNamed(context, "Bar");
 LLVMValueRef value = LLVMGetUndef(type);

  LLVMValueRef global = LLVMAddGlobal(module, LLVMInt8TypeInContext(context), "g");

 unsigned id = LLVMGetMDKindIDInContext(context, "test.meta", 9);
 LLVMMetadataRef meta = LLVMValueAsMetadata(value);
 LLVMGlobalSetMetadata(global, id, LLVMMDNodeInContext2(context, &meta, 1));
  LLVMWriteBitcodeToFile(module, "test.bc");
  // clean memory
  LLVMDisposeBuilder(builder);
  LLVMDisposeModule(module);
 LLVMContextDispose(context);
  return 0;
}
```

The issue can be reproduced with 6efa850b096dc31f8e161374c1881ad715f9b946.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVk-P27gP_TTKhWggy7FjH3KYJL8Ug1-nh7bbOS5ki060K0uBLHWafvqFJDv_Jl1ggYFHjsjH90iKFh8GudeIK1KsSbGdce8Oxq6c5Pqn5GbvZ40Rp9XrATVw0LxHAe50RJADGK1O4AcU0JxgMD3CD648DiCDbY-OC-44mA447JVpuCJsA-6A1zg9P4E2DhqEo5XaoQDjXUAkJVXqR_9ByIGUdE7oltCn9Pzq8DiQfHzL5rA1b1oZLoBrAV7_kkcgxdrh4Oa_5JEUW8Kqg3PJie0I2-2lO_hm3pqesF2IM_77cLTmL2wdYbtOKhwI22WU5VlRVITtzoisTrHZHL54fc0Vok3TkpJGNifj4U0qBXt0UXxnlDJvUu-D0KN3Zx3js6TpL5JKP-VreDHCK3zeAsm3QNhyisKWyWYw3rb4Z-AcsjuasZ0xhLEb_AXdx1386dBqrsbagKxCeQjLInQoX3ihN74soyNyRpZrwoo1t-C1wI4st3f802s-h2_nig_O-talwpOSrrkNWZJD7ACpW-UFitA-pKSRhVKh9PCK0HIdjPao0XKHZ4uU6Ia3f0NnTX_rGdrIDyHVU4H4u15Kz8Ax-IHUR--AsOomAGF1YBC6dGIQu_62nkdr9pb384flbKcU5qNQIPkmcmoJ222MxfmB5P_7V6u1dK9WOrTXpvEptYOeSx2IsxpCceLvAJ8-fX_ZGO3wp_uCHbRpGat4tbWxyB0mb5LfOKfOC77Qx-XZN-0k11fpDp95j896RIxYU_-xzRT4Pf7aSyXQhgBNWl7IRejR4Br5AdgEmY43tNH1ZmZdB_12OkZJqRXHcF9je6agQYu4jhSOBgsdG-RcaQiO38PcC3BxAJ7xPqL7I54NVsX4D9jeeI8HcXJ_EuLjODarlPnAIuw8a1cFBb9JSeK6v2M6hvQ6TnwBUlwTfdn-X2rxvH0IGfHOY2EsaP0uDS_jyA9a0vwY8aPCp2HaJ6yKiXoHkOR-RXdleflySDHpf9l-NuKint1zLRPNDWQxHfcdF8_QWrrWCPxmdjIk9irDk9YwXW9rfW4uhVxDj72xp2vgrRyOZpgalrCqmVb3FEbLlzHoOfpdQkaBo_Xjxgew6LzVQC-l_s0wvsw6OQwep5Fm8WiN8C0KeJPuACV2vCpoQ-tStHnWVZiVWb5ctFlVZVwss6Krm3pRjoNuJla5qPOaz3CVlcuMFst8SWeHFS6qmpWs6Cqa07Kuy6aruyJnlBUL2vJ2JleMMpaxbMFYXmZ0zhtGOWuzBctzLNolWVDsuVTzMALnxu5nkfiqqAtWzRRvUA3x6sKYxrekKhSt2M7sKo7Nxu8HsqBKDm64oDjpFK7O14v8CTouFThz-cDwu2_Wgbt3l55Hd5yZt2r1n-8akXm4bERl_wQAAP__yUvrkg">