[PATCH] D127625: [Debug] [Coroutines] Get rid of DW_ATE_address
David Blaikie via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 16 14:22:25 PDT 2022
dblaikie added inline comments.
================
Comment at: llvm/lib/Transforms/Coroutines/CoroFrame.cpp:925
RetType = Builder.createBasicType(OS.str(), Layout.getTypeSizeInBits(Ty),
- dwarf::DW_ATE_address,
- llvm::DINode::FlagArtificial);
+ dwarf::DW_ATE_unsigned_char, llvm::DINode::FlagArtificial);
}
----------------
ChuanqiXu wrote:
> dblaikie wrote:
> > ChuanqiXu wrote:
> > > dblaikie wrote:
> > > > How come this one became `unsigned char` rather than pointer type?
> > > The intention of the 'else' section is to create a DIType for an unresolved type. And the unresolved type lives in the coroutine frame. So it is a little bit odd for me to treat it as a pointer type. Since the size of the unresolved type might be larger than a pointer.
> > >
> > > The choice to use `DW_ATE_unsigned_char` might not be correct. Here is my thoughts. I want to treat the unresolved type as bytes. I want to make it as something like "I don't know what you are so I will present the bytes directly". And `DW_ATE_unsigned_char` is the closest thing I found in DW_ATE* things. How do you think about it?
> > >
> > > This is covered in the test as vector types. Since we failed to recognize vector types now, we would treat it as a unresolved type with 128 size.
> > So this is going to create an arbitrarily large "unsigned char" type (that might be tens of bytes, etc?) - is it at least a multiple of whole bytes? Maybe it should be a char array instead?
> > So this is going to create an arbitrarily large "unsigned char" type (that might be tens of bytes, etc?)
>
> Yes.
>
> > is it at least a multiple of whole bytes? Maybe it should be a char array instead?
>
> From my understanding, I feel like the allowed choices is listed in https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/BinaryFormat/Dwarf.def#L917-L937. I feel like a char array might be good. But I am not sure how to make it.
>
>
You can check Clang's code for making array types - DIBuilder::createArrayType, passed in the char basic type.
================
Comment at: llvm/test/Transforms/Coroutines/coro-debug-coro-frame.ll:36
+; CHECK-DAG: ![[INT64_PTR]] = !DIDerivedType(tag: DW_TAG_member, name: "__int_64_Ptr_3",{{.*}} baseType: ![[INT64_PTR_BASE:[0-9]+]]
+; CHECK-DAG: ![[INT64_PTR_BASE]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__int_64_Ptr", baseType: null, size: 64
+; CHECK-DAG: ![[INT32_2]] = !DIDerivedType(tag: DW_TAG_member, name: "__int_32_4", scope: ![[FRAME_TYPE]], file: ![[FILE]], line: [[PROMISE_VAR_LINE]], baseType: ![[I32_BASE:[0-9]+]]{{.*}}, flags: DIFlagArtificial
----------------
ChuanqiXu wrote:
> dblaikie wrote:
> > ChuanqiXu wrote:
> > > dblaikie wrote:
> > > > Why does this type have a name? I think it should probably be nameless - so it should merge with other instances of the same pointer type created for the original source code, etc.
> > > The name here is try to provide more information as much as possible. Ideally, I think this one should be the `int*` type. It shows the the ability of type resolver in current coroutine compiler is not strong enough. Given this revision aims to get rid of DW_ATE_address, I would try to fix the problem in other revisions.
> > >
> > > For the duplicated DITypes problem, this is tested in the following function 'bar' that the generated DIType would be reused.
> > > The name here is try to provide more information as much as possible. Ideally, I think this one should be the int* type.
> >
> > Any reason it can't be int*? Currently it's void*.
> >
> > > Given this revision aims to get rid of DW_ATE_address, I would try to fix the problem in other revisions.
> >
> > Sure
> >
> > > For the duplicated DITypes problem, this is tested in the following function 'bar' that the generated DIType would be reused.
> >
> > I was thinking of the types created from the original C++ source that has pointers in it too - not other types created by the coroutine lowering code.
> > Any reason it can't be int*? Currently it's void*.
>
> It is due to the current mechanism to solve LLVM types to DITypes is not mature enough. My bad. Let's enhance them later.
>
> > I was thinking of the types created from the original C++ source that has pointers in it too - not other types created by the coroutine lowering code.
>
> It would try to find @dbg.declare intrinsics for variables in the frame. If founded, it would reuse that one. But if it failed to find one, it would only try to create one.
> > Any reason it can't be int*? Currently it's void*.
>
> It is due to the current mechanism to solve LLVM types to DITypes is not mature enough. My bad. Let's enhance them later.
Not sure I follow - but sure, can handle that in a follow-up patch.
> > I was thinking of the types created from the original C++ source that has pointers in it too - not other types created by the coroutine lowering code.
>
> It would try to find @dbg.declare intrinsics for variables in the frame. If founded, it would reuse that one. But if it failed to find one, it would only try to create one.
Sure - but what I mean is if it tries to create one it could create one that's more similar to the ones the frontend would create - a named pointer type is a weird beast that we wouldn't usually create in the frontend (pointer types don't have names, unless it's via a typedef - the typedef has the name, the pointer type does not).
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127625/new/
https://reviews.llvm.org/D127625
More information about the llvm-commits
mailing list