[LLVMdev] DebugFactory

Talin viridia at gmail.com
Wed Sep 23 13:43:04 PDT 2009


On Wed, Sep 23, 2009 at 1:04 PM, Devang Patel <devang.patel at gmail.com>wrote:

> On Tue, Sep 22, 2009 at 4:49 PM, Talin <viridia at gmail.com> wrote:
> >
> >
> > On Tue, Sep 22, 2009 at 9:21 AM, Devang Patel <devang.patel at gmail.com>
> > wrote:
> >>
> >> On Tue, Sep 22, 2009 at 9:21 AM, Devang Patel <devang.patel at gmail.com>
> >> wrote:
> >> > On Tue, Sep 22, 2009 at 12:14 AM, Talin <viridia at gmail.com> wrote:
> >> >> So, one feature of the late, lamented DebugInfoBuilder that I am
> >> >> missing
> >> >> quite badly, and which is not available in the current DIFactory, is
> >> >> the
> >> >> ability to specify structure offsets abstractly. The DebugFactory
> >> >> requires that you pass in structure offset information as ints,
> whereas
> >> >> DebugInfoBuilder had "offsetOf" and "alignOf" methods, similar to the
> >> >> "sizeOf" trick, that would create the constants for you in a way that
> >> >> didn't require your front end to know the sizes of things. So far
> I've
> >> >> been able to avoid having any references to target machines in my
> >> >> frontend, but now that I am trying to flesh out my debug info more
> >> >> fully
> >> >> I'm finding it hard to use DIFactory as-is.
> >> >>
> >> >> What I'd like to see is a set of alternative factory methods in
> >> >> DIFactory, where you pass in an LLVM type, and possibly a GEP index,
> >> >> plus all of the parameters that it can't figure out from looking at
> the
> >> >> type. So you can eliminate the offset, size, and alignment parameters
> >> >> since those can be figured out from the type.
> >> >
> >> > Is it true that DIFactory can figure this out with Target info in all
> >> > cases ?
> >>
> >> oops... I meant to say "... without Target info..."
> >>
> > // Calculate the size of the specified LLVM type.
> > Constant * DebugInfoBuilder::getSize(const Type * type) {
> >     Constant * one = ConstantInt::get(Type::Int32Ty, 1);
> >     return ConstantExpr::getPtrToInt(
> >         ConstantExpr::getGetElementPtr(
> >             ConstantPointerNull::get(PointerType::getUnqual(type)),
> >             &one, 1), Type::Int32Ty);
> > }
> >
> > Constant * DebugInfoBuilder::getAlignment(const Type * type) {
> >     // Calculates the alignment of T using "sizeof({i8, T}) - sizeof(T)"
> >     return ConstantExpr::getSub(
> >         getSize(StructType::get(Type::Int8Ty, type, NULL)),
> >         getSize(type));
> > }
> >
> > This was code that was checked in before DebugInfoBuilder was replaced by
> > DIFactory.
>
> This adds code to find the info that FE knows anyway. That is
> undesirable IMO. If there is a need, you can do this trick in your FE.
>
> Eh? My point is that the FE *doesn't* know this information. A
platform-agnostic FE doesn't know how many bits are in a pointer, for
example. By using this code, the knowledge of how big fields are can be
deferred until the target is selected.

In other words - with the old code, I could generate valid DWARF debugging
information without having a target selected. With the new code, I'm
required to select a target before I can generate debug info.

-- 
-- Talin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090923/3fb016d3/attachment.html>


More information about the llvm-dev mailing list