[LLVMbugs] [Bug 21311] New: Add deadfield attribute to ignore initializers for a structure field

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sun Oct 19 23:02:52 PDT 2014


http://llvm.org/bugs/show_bug.cgi?id=21311

            Bug ID: 21311
           Summary: Add deadfield attribute to ignore initializers for a
                    structure field
           Product: clang
           Version: unspecified
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: -New Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: josh at joshtriplett.org
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

(Matching GCC request at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62194 ;
GCC and clang should implement the same attribute name and syntax.)

This request is the result of a discussion at Kernel Summit 2014, about
handling conditional code without massive transitions or excessive preprocessor
abuse.

Frequently, a structure will have a field that is only used with specific
configurations.  For instance, a driver may have an "ops" structure with
suspend/resume methods, but those methods will only be called if the kernel
configuration supports suspend/resume.  If we configure suspend/resume out of
the kernel, nothing will call or otherwise read foo->suspend(...).  However,
drivers will still have designated assignments to that structure field:

struct something_ops {
    ...
    .suspend = foo_suspend,
    .resume = foo_resume,
    ...
}

Currently, this has to work in one of two ways: either the structure fields
unconditionally exist in all cases so that the designated assignments don't
break (keeping a reference to the functions and preventing them from being
compiled out), or the structure field and corresponding designated assignments
must be #ifdef'd out (requiring a massive transition and a pile of ugly
preprocessor directives proportional to the number of structures).

Discussion at Kernel Summit came up with the following alternative:

Create a new attribute "deadfield".  A field with that attribute is not
actually included in the layout of the structure.  Writes or designated
assignments to the field get ignored.  Attempting to read from the field
produces an error.  Values assigned to dead fields are treated as
__attribute__((unused)).

That would then allow definitions of instances of the structure to remain
unmodified in all configurations.

Optionally, the "deadfield" attribute could take a single parameter, which is a
constant value to substitute for any read from the field rather than producing
an error.  For instance, a function pointer field may have a do-nothing stub
function (which clang can then inline and turn into no code), or a flag field
may have a constant value (allowing subsequent constant-folding).

I'm willing to work on a patch for this.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20141020/1eb6381d/attachment.html>


More information about the llvm-bugs mailing list