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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect debug info for C++20 coroutine resume and destroy functions
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++20,
            coroutines
      </td>
    </tr>

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

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

<pre>
    It seems that the 

In https://godbolt.org/z/qM1Eqjhrh, we see

> define dso_local void @_Z17my_generator_funcv(ptr nocapture writeonly sret(%struct.int_generator) align 8 %0) local_unnamed_addr #0 personality ptr @__gxx_personality_v0 !dbg !115 {
> [...]
> define internal fastcc void @_Z17my_generator_funcv.resume(ptr noalias nonnull align 8 dereferenceable(24) %0) #5 personality ptr @__gxx_personality_v0 !dbg !167 {
> [...]
> define internal fastcc void @_Z17my_generator_funcv.destroy(ptr noalias nonnull align 8 dereferenceable(24) %0) #5 personality ptr @__gxx_personality_v0 !dbg !198 {

and the corresponding debug info

> !115 = distinct !DISubprogram(name: "my_generator_func", linkageName: "_Z17my_generator_funcv", scope: !6, file: !6, line: 28, type: !116, scopeLine: 28, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !118)
> !167 = distinct !DISubprogram(name: "my_generator_func", linkageName: "_Z17my_generator_funcv", scope: !6, file: !6, line: 28, type: !116, scopeLine: 28, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !168)
> !198 = distinct !DISubprogram(name: "my_generator_func", linkageName: "_Z17my_generator_funcv", scope: !6, file: !6, line: 28, type: !116, scopeLine: 28, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !199)

Note how all 3 functions are assigned the same name and linkage name. Afaik, assigning the same `linkageName` is invalid.
Assigning the same `name` is valid, but surprising. We should probably distinguish the functions by assigning different names.

Furthermore, all 3 routines are defined to have type `!116`, which is defined as
> !116 = !DISubroutineType(types: !117)
> !117 = !{!7}
> !7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "int_generator", file: !6, line: 5, size: 64, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !8, identifier: "_ZTS13int_generator")

which indicates that all 3 functions (also the resume and destroy functions) take no parameters and return an `int_generator`. However, this is only correct for the ramp function.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztV0tv2zgQ_jXyhaighyVbBx0cu94NsJsNNgEK9CJQIiWxoUmVpJy6v36HlGTZSbYLFAj2UsCWTHLe881wXEpyym8N0pQeNDItNvCgyAt2XrAZnrcCtcZ02os3XrSHTyNJKbnxpWpg9R2-X_8MP3790qrWi7bomVpplxK8-CMitGaCIqJlwWWFOTpKRpC3DIrP4epwKhoqqMJGqqLuRXX0onVnFBJA2pleUfSsmKFS8BPSiho49qJEG9VXxmfCzOxelCHMWSPQGgFJYNdOYdELgQ-UFJgQBUdxgDqqtBRAbU7IarPWFM23b8XFQXEMgDgkZWNfYZggb3Uzu-UlN77ve8nuladgFVUgA9VYm6r6D399RXV_oGe3QTfW8Bai5_zsEKGK1vAVFcUlt9TR0jo4OQpeJT_jVbp6J68IhRzJ0__kVra-cMs9sSAO35VUEPBOCsJEA_rLvgHXavkStVPK4x0iTBsmKmP3drcPfdkp2Sh8AGstrqA64CR6FQPYs0XBmXjCDb2bKf8N945cV7IbCcPUbtSMX61BnlvbOtgiczpTh8O5E_DHFVHNcWOLGO1u9_DzXkkjLSPkb7UdNzecbzHnekd1pVhJiZPV7WfWh3u72Fk0MMOkGJmH7b86ww7s-8DWA8FoVGDXULYYDCJ3ElBxthZMy67jbcH4K97vFO_0dbxtlfyK9zvFO8vmeLvnnTQUtfIZmh9HMbJBsWo0wnDJYa2hI9KhR2mIJbKhR7ZrjQF2Gz7a1Jg9WaUDh21iZxYvDS6zkQaIaWhuR-iQxB-M2LzJJWZyR2zllz3MBr3qFNNA7qNPQN7KnhME8CihW59G4DQ9060TN7tUni7sI6x2Pd44F7R_GZR9r4BTHaSizikXGiV7kEuHyAzXDwRGohYfqUOEtXlEROoy8NyyqrXmT9RYv2jlqYP6hPBRw6NFV7S2Iue-tHpVJ-FqYraXSgQUq90VxVt9aysPndQwukxKcONw9ql43PxWDAMMjDeFQzi4cFFqL8aa6EdlkjgcAzLtIl2-UQ5W_z1k4-b093TXXtTFnRSPih0Z5paVcnqARE3BcNXFCOywmlF1ru_HhzB-beQV2seMwDVbYUPHAfMl8iEsmGvpwDOMQQ7x4-wwE9pRwOAnqAGJOgyticIsoh0t1F6vBPy0mLi2KQ189Lt8pkew3LaS1laDRm6UdGMApKqWatCOD91Zn7-geZimYbReplm8IHlMsjjDC8MMp_mtmJjn6cHJ2XoRoOMmCqz0AWA_9GrRK56_GLCZafvSryQ03z3nx-n1AWruC6iEJdO6B7RG-2QVR-GizcMoW5LVukzWMDyVabYMsipdJ8uELoM4WYcLjkvKdQ6jHaSpmowccWW3Jmu13Ut2C5ZHQRQF6ygOMxAQ-xUuwyBMcVovQxIGEUxg9IAZ961t9t_AQuXOTIiHhkMOlaDnw7G5UWcCyMe9aaXKj7IBuxqqsWgWzq3c-fQPLJ76Ew">