On 12/19/2014 05:13 AM, Richard Smith wrote:
On Tue, Dec 16, 2014 at 1:47 AM, Stephan Bergmann <[email protected]
<mailto:[email protected]>> wrote:

    Is there any update on this?


Please move the attribute to buildImplicitRecord; this attribute should
be applied to all implicitly-declared record types. Also, please
reformat the patch to 80 columns and add a testcase.

Done, see attached va_list_tag_default_visibility.patch. (I added the test to test/CodeGenCXX/ so that it can #include <typeinfo>.)

    On 07/09/2014 10:37 AM, Alp Toker wrote:

        On 09/07/2014 11:29, Alp Toker wrote:

            On 09/07/2014 09:55, Stephan Bergmann wrote:

                ping

                On 06/25/2014 05:45 PM, Stephan Bergmann wrote:

                    I stumbled across this on Linux with
                    -fvisibility=hidden when
                    -fsanitize=function reported a false positive for an
                    indirect call to a
                    function with a va_list (aka __builtin_va_list, aka
                    __va_list_tag
                    (*)[1]) parameter.  Because __va_list_tag was
                    considered hidden, the
                    RTTI for the function's type was not exported from
                    the two shared
                    libraries involved, so the equality check failed.

                    This would apparently also need to be fixed in the other
                    Create*BuiltinVaListDecl variants, but I'm not sure
                    (a) whether the
                    added const_cast is really deemed appropriate here
                    (though I guess so,
                    given the large number of existing similar
                    const_casts across
                    ASTContext.cpp), and (b) what the preferred way
                    would be to break that
                    long line. ;)


            Hi Stephan,

            I wrote the buildImplicitRecord() utility, and in principle the
            attribute could be added centrally to that function -- if
            these are
            the semantics we want for most built-in types, as you
            suggest, it
            makes sense to centralize the decision.

            Another option would be to calculate the special linkage in
            computeLVForDecl() instead of using an attribute, but it doesn't
            really matter either way I think as the result is the same.

            The bigger question is whether (1) default visibility is
            correct for
            all built-in types currently being generated by
            buildImplicitRecord()
            and (2) whether this is a valid choice for all targets we
            support
            including MSVC drop-in compatibility mode.

            To help answer question (1), the affected built-in types
            would be:

            lib/AST/ASTContext.cpp:    Float128StubDecl =
            buildImplicitRecord("____float128");
            lib/AST/ASTContext.cpp:    CFConstantStringTypeDecl =
            buildImplicitRecord("__NSConstantString");
            lib/AST/ASTContext.cpp:    RecordDecl *ObjCSuperTypeDecl =
            buildImplicitRecord("objc___super");
            lib/AST/ASTContext.cpp:  RD =
            buildImplicitRecord("__block___descriptor");
            lib/AST/ASTContext.cpp:  RD =
            buildImplicitRecord("__block___descriptor_withcopydispose");
            lib/AST/ASTContext.cpp:  RecordDecl *VaListTagDecl =
            Context->buildImplicitRecord("____va_list");
            lib/AST/ASTContext.cpp:  VaListTagDecl =
            Context->buildImplicitRecord("____va_list_tag");
            lib/AST/ASTContext.cpp:  VaListTagDecl =
            Context->buildImplicitRecord("____va_list_tag");
            lib/AST/ASTContext.cpp:  RecordDecl *VaListDecl =
            Context->buildImplicitRecord("____va_list");
            lib/AST/ASTContext.cpp:  VaListTagDecl =
            Context->buildImplicitRecord("____va_list_tag");
            lib/CodeGen/CodeGenModule.cpp:    RecordDecl *D =
            Context.buildImplicitRecord("____builtin_NSString");
            lib/CodeGen/CodeGenModule.cpp:    RecordDecl *D =
            Context.buildImplicitRecord("____objcFastEnumerationState");
            lib/Sema/Sema.cpp:
            PushOnScopeChains(Context.__buildImplicitRecord("type___info",
            TTK_Class),


        There are also the implicit typedefs -- I don't know what the
        visibility/export deal is for those:


        lib/AST/ASTContext.cpp:    Int128Decl =
        buildImplicitTypedef(Int128Ty,
        "__int128_t");
        lib/AST/ASTContext.cpp:    UInt128Decl =
        buildImplicitTypedef(__UnsignedInt128Ty, "__uint128_t");
        lib/AST/ASTContext.cpp:
        buildImplicitTypedef(__getObjCIdType(),
        "instancetype");
        lib/AST/ASTContext.cpp:    ObjCIdDecl = buildImplicitTypedef(T,
        "id");
        lib/AST/ASTContext.cpp:    ObjCSelDecl = buildImplicitTypedef(T,
        "SEL");
        lib/AST/ASTContext.cpp:    ObjCClassDecl = buildImplicitTypedef(T,
        "Class");
        lib/AST/ASTContext.cpp:  return Context->buildImplicitTypedef(__T,
        "__builtin_va_list");
        lib/AST/ASTContext.cpp:  return Context->buildImplicitTypedef(__T,
        "__builtin_va_list");
        lib/AST/ASTContext.cpp:  return
        Context->buildImplicitTypedef(__VaListTagType, "__builtin_va_list");
        lib/AST/ASTContext.cpp:
        Context->buildImplicitTypedef(__VaListTagType,
        "__va_list_tag");
        lib/AST/ASTContext.cpp:  return
        Context->buildImplicitTypedef(__VaListTagArrayType,
        "__builtin_va_list");
        lib/AST/ASTContext.cpp:
        Context->buildImplicitTypedef(__VaListTagType,
        "__va_list_tag");
        lib/AST/ASTContext.cpp:  return
        Context->buildImplicitTypedef(__VaListTagArrayType,
        "__builtin_va_list");
        lib/AST/ASTContext.cpp:  return
        Context->buildImplicitTypedef(__IntArrayType, "__builtin_va_list");
        lib/AST/ASTContext.cpp:  return Context->buildImplicitTypedef(__T,
        "__builtin_va_list");
        lib/AST/ASTContext.cpp:
        Context->buildImplicitTypedef(__VaListTagType,
        "__va_list_tag");
        lib/AST/ASTContext.cpp:  return
        Context->buildImplicitTypedef(__VaListTagArrayType,
        "__builtin_va_list");
        lib/Sema/Sema.cpp:
        PushOnScopeChains(Context.__buildImplicitTypedef(T,
        Name), TUScope);

        Alp.


            I'll need help answering those questions from
            linkage/visibility folks
            on the list before going forward with a change like this.

            Thanks
            Alp.
Index: lib/AST/ASTContext.cpp
===================================================================
diff --git a/cfe/trunk/lib/AST/ASTContext.cpp b/cfe/trunk/lib/AST/ASTContext.cpp
--- a/cfe/trunk/lib/AST/ASTContext.cpp	(revision 225158)
+++ b/cfe/trunk/lib/AST/ASTContext.cpp	(working copy)
@@ -876,6 +876,9 @@
     NewDecl = RecordDecl::Create(*this, TK, getTranslationUnitDecl(), Loc, Loc,
                                  &Idents.get(Name));
   NewDecl->setImplicit();
+  NewDecl->addAttr(TypeVisibilityAttr::CreateImplicit(
+                       *const_cast<ASTContext*>(this),
+                       TypeVisibilityAttr::Default));
   return NewDecl;
 }
 
Index: test/CodeGenCXX/implicit-record-visibility.cpp
===================================================================
diff --git a/cfe/trunk/test/CodeGenCXX/implicit-record-visibility.cpp b/cfe/trunk/test/CodeGenCXX/implicit-record-visibility.cpp
new file mode 10644
--- /dev/null	(revision 0)
+++ b/cfe/trunk/test/CodeGenCXX/implicit-record-visibility.cpp	(working copy)
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 %s -I%S -fvisibility hidden -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s
+
+#include <stdarg.h>
+#include <typeinfo>
+
+// If struct __va_list_tag did not explicitly have default visibility, then
+// under -fvisibility hidden the type of function f, due to its va_list (aka
+// __builtin_va_list, aka __va_list_tag (*)[1]) parameter would be hidden:
+
+// CHECK: @_ZTSFvP13__va_list_tagE = linkonce_odr constant
+// CHECK: @_ZTIFvP13__va_list_tagE = linkonce_odr constant
+void f(va_list) { (void)typeid(f); }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to