<div dir="ltr"><div>Hello David,</div><div><br></div><div>This commit broke the following test on the expensive check builder:</div><div>CodeGenObjC/2007-04-03-ObjcEH.m</div><div><br></div><div>The last green build is for r339427 - <a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/11726">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/11726</a></div><div>r339428 makes it red - <a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/11723">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/11723</a></div><div><br></div><div>Could you take care of this, please?</div><div><br></div><div>Thanks</div><div><br></div><div>Galina<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 10, 2018 at 5:53 AM, David Chisnall via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: theraven<br>
Date: Fri Aug 10 05:53:13 2018<br>
New Revision: 339428<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=339428&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=339428&view=rev</a><br>
Log:<br>
Add Windows support for the GNUstep Objective-C ABI V2.<br>
<br>
Summary:<br>
Introduces funclet-based unwinding for Objective-C and fixes an issue<br>
where global blocks can't have their isa pointers initialised on<br>
Windows.<br>
<br>
After discussion with Dustin, this changes the name mangling of<br>
Objective-C types to prevent a C++ catch statement of type struct X*<br>
from catching an Objective-C object of type X*.<br>
<br>
Reviewers: rjmccall, DHowett-MSFT<br>
<br>
Reviewed By: rjmccall, DHowett-MSFT<br>
<br>
Subscribers: mgrang, mstorsjo, smeenai, cfe-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D50144" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D50144</a><br>
<br>
Modified:<br>
    cfe/trunk/include/clang/<wbr>Driver/Options.td<br>
    cfe/trunk/lib/AST/<wbr>MicrosoftMangle.cpp<br>
    cfe/trunk/lib/CodeGen/<wbr>CGException.cpp<br>
    cfe/trunk/lib/CodeGen/<wbr>CGObjCGNU.cpp<br>
    cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.cpp<br>
    cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.h<br>
    cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br>
    cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp<br>
    cfe/trunk/test/CodeGenObjC/<wbr>gnu-init.m<br>
    cfe/trunk/test/CodeGenObjC/<wbr>gnustep2-proto.m<br>
    cfe/trunk/test/CodeGenObjCXX/<a href="http://arc-marker-funclet.mm" rel="noreferrer" target="_blank">a<wbr>rc-marker-funclet.mm</a><br>
    cfe/trunk/test/CodeGenObjCXX/<a href="http://microsoft-abi-arc-param-order.mm" rel="noreferrer" target="_blank">m<wbr>icrosoft-abi-arc-param-order.<wbr>mm</a><br>
    cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-extensions.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-extensions.mm</a><br>
    cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-types.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-types.mm</a><br>
<br>
Modified: cfe/trunk/include/clang/<wbr>Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Driver/Options.td?rev=<wbr>339428&r1=339427&r2=339428&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/<wbr>Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/<wbr>Driver/Options.td Fri Aug 10 05:53:13 2018<br>
@@ -1488,7 +1488,7 @@ def fobjc_weak : Flag<["-"], "fobjc-weak<br>
   HelpText<"Enable ARC-style weak references in Objective-C">;<br>
<br>
 // Objective-C ABI options.<br>
-def fobjc_runtime_EQ : Joined<["-"], "fobjc-runtime=">, Group<f_Group>, Flags<[CC1Option]>,<br>
+def fobjc_runtime_EQ : Joined<["-"], "fobjc-runtime=">, Group<f_Group>, Flags<[CC1Option, CoreOption]>,<br>
   HelpText<"Specify the target Objective-C runtime kind and version">;<br>
 def fobjc_abi_version_EQ : Joined<["-"], "fobjc-abi-version=">, Group<f_Group>;<br>
 def fobjc_nonfragile_abi_version_<wbr>EQ : Joined<["-"], "fobjc-nonfragile-abi-version=<wbr>">, Group<f_Group>;<br>
<br>
Modified: cfe/trunk/lib/AST/<wbr>MicrosoftMangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>MicrosoftMangle.cpp?rev=<wbr>339428&r1=339427&r2=339428&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/<wbr>MicrosoftMangle.cpp (original)<br>
+++ cfe/trunk/lib/AST/<wbr>MicrosoftMangle.cpp Fri Aug 10 05:53:13 2018<br>
@@ -445,7 +445,7 @@ void MicrosoftCXXNameMangler::<wbr>mangle(con<br>
     mangleFunctionEncoding(FD, Context.shouldMangleDeclName(<wbr>FD));<br>
   else if (const VarDecl *VD = dyn_cast<VarDecl>(D))<br>
     mangleVariableEncoding(VD);<br>
-  else<br>
+  else if (!isa<ObjCInterfaceDecl>(D))<br>
     llvm_unreachable("Tried to mangle unexpected NamedDecl!");<br>
 }<br>
<br>
@@ -1884,13 +1884,13 @@ void MicrosoftCXXNameMangler::<wbr>mangleType<br>
     llvm_unreachable("placeholder types shouldn't get to name mangling");<br>
<br>
   case BuiltinType::ObjCId:<br>
-    mangleArtificalTagType(TTK_<wbr>Struct, "objc_object");<br>
+    mangleArtificalTagType(TTK_<wbr>Struct, ".objc_object");<br>
     break;<br>
   case BuiltinType::ObjCClass:<br>
-    mangleArtificalTagType(TTK_<wbr>Struct, "objc_class");<br>
+    mangleArtificalTagType(TTK_<wbr>Struct, ".objc_class");<br>
     break;<br>
   case BuiltinType::ObjCSel:<br>
-    mangleArtificalTagType(TTK_<wbr>Struct, "objc_selector");<br>
+    mangleArtificalTagType(TTK_<wbr>Struct, ".objc_selector");<br>
     break;<br>
<br>
 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \<br>
@@ -2570,9 +2570,10 @@ void MicrosoftCXXNameMangler::<wbr>mangleType<br>
<br>
 void MicrosoftCXXNameMangler::<wbr>mangleType(const ObjCInterfaceType *T, Qualifiers,<br>
                                          SourceRange) {<br>
-  // ObjC interfaces have structs underlying them.<br>
+  // ObjC interfaces are mangled as if they were structs with a name that is<br>
+  // not a valid C/C++ identifier<br>
   mangleTagTypeKind(TTK_Struct);<br>
-  mangleName(T->getDecl());<br>
+  mangle(T->getDecl(), ".objc_cls_");<br>
 }<br>
<br>
 void MicrosoftCXXNameMangler::<wbr>mangleType(const ObjCObjectType *T, Qualifiers,<br>
@@ -2590,11 +2591,11 @@ void MicrosoftCXXNameMangler::<wbr>mangleType<br>
<br>
   Out << "?$";<br>
   if (T->isObjCId())<br>
-    mangleSourceName("objc_object"<wbr>);<br>
+    mangleSourceName(".objc_<wbr>object");<br>
   else if (T->isObjCClass())<br>
-    mangleSourceName("objc_class")<wbr>;<br>
+    mangleSourceName(".objc_class"<wbr>);<br>
   else<br>
-    mangleSourceName(T-><wbr>getInterface()->getName());<br>
+    mangleSourceName((".objc_cls_" + T->getInterface()->getName()).<wbr>str());<br>
<br>
   for (const auto &Q : T->quals())<br>
     mangleObjCProtocol(Q);<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CGException.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGException.cpp?rev=339428&r1=<wbr>339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CGException.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CGException.cpp Fri Aug 10 05:53:13 2018<br>
@@ -1829,7 +1829,7 @@ void CodeGenFunction::<wbr>startOutlinedSEHHe<br>
   SmallString<128> Name;<br>
   {<br>
     llvm::raw_svector_ostream OS(Name);<br>
-    const FunctionDecl *ParentSEHFn = ParentCGF.CurSEHParent;<br>
+    const NamedDecl *ParentSEHFn = ParentCGF.CurSEHParent;<br>
     assert(ParentSEHFn && "No CurSEHParent!");<br>
     MangleContext &Mangler = CGM.getCXXABI().<wbr>getMangleContext();<br>
     if (IsFilter)<br>
@@ -1972,6 +1972,11 @@ llvm::Value *CodeGenFunction::EmitSEHAbn<br>
   return Builder.CreateZExt(&*AI, Int32Ty);<br>
 }<br>
<br>
+void CodeGenFunction::<wbr>pushSEHCleanup(CleanupKind Kind,<br>
+                                     llvm::Function *FinallyFunc) {<br>
+  EHStack.pushCleanup<<wbr>PerformSEHFinally>(Kind, FinallyFunc);<br>
+}<br>
+<br>
 void CodeGenFunction::<wbr>EnterSEHTryStmt(const SEHTryStmt &S) {<br>
   CodeGenFunction HelperCGF(CGM, /*suppressNewContext=*/true);<br>
   if (const SEHFinallyStmt *Finally = S.getFinallyHandler()) {<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CGObjCGNU.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCGNU.cpp?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGObjCGNU.cpp?rev=339428&r1=<wbr>339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CGObjCGNU.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CGObjCGNU.cpp Fri Aug 10 05:53:13 2018<br>
@@ -18,6 +18,7 @@<br>
 #include "CGCleanup.h"<br>
 #include "CodeGenFunction.h"<br>
 #include "CodeGenModule.h"<br>
+#include "CGCXXABI.h"<br>
 #include "clang/CodeGen/<wbr>ConstantInitBuilder.h"<br>
 #include "clang/AST/ASTContext.h"<br>
 #include "clang/AST/Decl.h"<br>
@@ -178,6 +179,9 @@ protected:<br>
   /// runtime provides some LLVM passes that can use this to do things like<br>
   /// automatic IMP caching and speculative inlining.<br>
   unsigned msgSendMDKind;<br>
+  /// Does the current target use SEH-based exceptions? False implies<br>
+  /// Itanium-style DWARF unwinding.<br>
+  bool usesSEHExceptions;<br>
<br>
   /// Helper to check if we are targeting a specific runtime version or later.<br>
   bool isRuntime(ObjCRuntime::Kind kind, unsigned major, unsigned minor=0) {<br>
@@ -217,6 +221,7 @@ protected:<br>
       llvm::Constant *value = llvm::ConstantDataArray::<wbr>getString(VMContext,Str);<br>
       auto *GV = new llvm::GlobalVariable(<wbr>TheModule, value->getType(), true,<br>
               llvm::GlobalValue::<wbr>LinkOnceODRLinkage, value, name);<br>
+      GV->setComdat(TheModule.<wbr>getOrInsertComdat(name));<br>
       if (Private)<br>
         GV->setVisibility(llvm::<wbr>GlobalValue::HiddenVisibility)<wbr>;<br>
       ConstStr = GV;<br>
@@ -810,8 +815,12 @@ class CGObjCGNUstep : public CGObjCGNU {<br>
       // Slot_t objc_slot_lookup_super(struct objc_super*, SEL);<br>
       SlotLookupSuperFn.init(&CGM, "objc_slot_lookup_super", SlotTy,<br>
                              PtrToObjCSuperTy, SelectorTy);<br>
-      // If we're in ObjC++ mode, then we want to make<br>
-      if (CGM.getLangOpts().CPlusPlus) {<br>
+      // If we're in ObjC++ mode, then we want to make <br>
+      if (usesSEHExceptions) {<br>
+          llvm::Type *VoidTy = llvm::Type::getVoidTy(<wbr>VMContext);<br>
+          // void objc_exception_rethrow(void)<br>
+          ExceptionReThrowFn.init(&CGM, "objc_exception_rethrow", VoidTy);<br>
+      } else if (CGM.getLangOpts().CPlusPlus) {<br>
         llvm::Type *VoidTy = llvm::Type::getVoidTy(<wbr>VMContext);<br>
         // void *__cxa_begin_catch(void *e)<br>
         EnterCatchFn.init(&CGM, "__cxa_begin_catch", PtrTy, PtrTy);<br>
@@ -888,22 +897,25 @@ class CGObjCGNUstep : public CGObjCGNU {<br>
 /// This is the ABI that provides a clean break with the legacy GCC ABI and<br>
 /// cleans up a number of things that were added to work around 1980s linkers.<br>
 class CGObjCGNUstep2 : public CGObjCGNUstep {<br>
-  /// The section for selectors.<br>
-  static constexpr const char *const SelSection = "__objc_selectors";<br>
-  /// The section for classes.<br>
-  static constexpr const char *const ClsSection = "__objc_classes";<br>
-  /// The section for references to classes.<br>
-  static constexpr const char *const ClsRefSection = "__objc_class_refs";<br>
-  /// The section for categories.<br>
-  static constexpr const char *const CatSection = "__objc_cats";<br>
-  /// The section for protocols.<br>
-  static constexpr const char *const ProtocolSection = "__objc_protocols";<br>
-  /// The section for protocol references.<br>
-  static constexpr const char *const ProtocolRefSection = "__objc_protocol_refs";<br>
-  /// The section for class aliases<br>
-  static constexpr const char *const ClassAliasSection = "__objc_class_aliases";<br>
-  /// The section for constexpr constant strings<br>
-  static constexpr const char *const ConstantStringSection = "__objc_constant_string";<br>
+  enum SectionKind<br>
+  {<br>
+    SelectorSection = 0,<br>
+    ClassSection,<br>
+    ClassReferenceSection,<br>
+    CategorySection,<br>
+    ProtocolSection,<br>
+    ProtocolReferenceSection,<br>
+    ClassAliasSection,<br>
+    ConstantStringSection<br>
+  };<br>
+  static const char *const SectionsBaseNames[8];<br>
+  template<SectionKind K><br>
+  std::string sectionName() {<br>
+    std::string name(SectionsBaseNames[K]);<br>
+    if (CGM.getTriple().<wbr>isOSBinFormatCOFF())<br>
+      name += "$m";<br>
+    return name;<br>
+  }<br>
   /// The GCC ABI superclass message lookup function.  Takes a pointer to a<br>
   /// structure describing the receiver and the class, and a selector as<br>
   /// arguments.  Returns the IMP for the corresponding method.<br>
@@ -1069,7 +1081,7 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
           isNamed ? StringRef(StringName) : ".objc_string",<br>
           Align, false, isNamed ? llvm::GlobalValue::<wbr>LinkOnceODRLinkage<br>
                                 : llvm::GlobalValue::<wbr>PrivateLinkage);<br>
-    ObjCStrGV->setSection(<wbr>ConstantStringSection);<br>
+    ObjCStrGV->setSection(<wbr>sectionName<<wbr>ConstantStringSection>());<br>
     if (isNamed) {<br>
       ObjCStrGV->setComdat(<wbr>TheModule.getOrInsertComdat(<wbr>StringName));<br>
       ObjCStrGV->setVisibility(llvm:<wbr>:GlobalValue::<wbr>HiddenVisibility);<br>
@@ -1247,9 +1259,10 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
       assert(!TheModule.<wbr>getGlobalVariable(RefName));<br>
       // Emit a reference symbol.<br>
       auto GV = new llvm::GlobalVariable(<wbr>TheModule, ProtocolPtrTy,<br>
-          false, llvm::GlobalValue::<wbr>ExternalLinkage,<br>
+          false, llvm::GlobalValue::<wbr>LinkOnceODRLinkage,<br>
           llvm::ConstantExpr::<wbr>getBitCast(Protocol, ProtocolPtrTy), RefName);<br>
-      GV->setSection(<wbr>ProtocolRefSection);<br>
+      GV->setComdat(TheModule.<wbr>getOrInsertComdat(RefName));<br>
+      GV->setSection(sectionName<<wbr>ProtocolReferenceSection>());<br>
       GV->setAlignment(CGM.<wbr>getPointerAlign().getQuantity(<wbr>));<br>
       Ref = GV;<br>
     }<br>
@@ -1282,9 +1295,22 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
<br>
     EmittedProtocol = true;<br>
<br>
+    auto SymName = SymbolForProtocol(<wbr>ProtocolName);<br>
+    auto *OldGV = TheModule.getGlobalVariable(<wbr>SymName);<br>
+<br>
     // Use the protocol definition, if there is one.<br>
     if (const ObjCProtocolDecl *Def = PD->getDefinition())<br>
       PD = Def;<br>
+    else {<br>
+      // If there is no definition, then create an external linkage symbol and<br>
+      // hope that someone else fills it in for us (and fail to link if they<br>
+      // don't).<br>
+      assert(!OldGV);<br>
+      Protocol = new llvm::GlobalVariable(<wbr>TheModule, ProtocolTy,<br>
+        /*isConstant*/false,<br>
+        llvm::GlobalValue::<wbr>ExternalLinkage, nullptr, SymName);<br>
+      return Protocol;<br>
+    }<br>
<br>
     SmallVector<llvm::Constant*, 16> Protocols;<br>
     for (const auto *PI : PD->protocols())<br>
@@ -1301,8 +1327,6 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
     EmitProtocolMethodList(PD-><wbr>class_methods(), ClassMethodList,<br>
         OptionalClassMethodList);<br>
<br>
-    auto SymName = SymbolForProtocol(<wbr>ProtocolName);<br>
-    auto *OldGV = TheModule.getGlobalVariable(<wbr>SymName);<br>
     // The isa pointer must be set to a magic number so the runtime knows it's<br>
     // the correct layout.<br>
     ConstantInitBuilder builder(CGM);<br>
@@ -1326,7 +1350,7 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
<br>
     auto *GV = ProtocolBuilder.<wbr>finishAndCreateGlobal(SymName,<br>
         CGM.getPointerAlign(), false, llvm::GlobalValue::<wbr>ExternalLinkage);<br>
-    GV->setSection(<wbr>ProtocolSection);<br>
+    GV->setSection(sectionName<<wbr>ProtocolSection>());<br>
     GV->setComdat(TheModule.<wbr>getOrInsertComdat(SymName));<br>
     if (OldGV) {<br>
       OldGV->replaceAllUsesWith(<wbr>llvm::ConstantExpr::<wbr>getBitCast(GV,<br>
@@ -1359,6 +1383,7 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
           TypeEncoding);<br>
       auto *GV = new llvm::GlobalVariable(<wbr>TheModule, Init->getType(),<br>
           true, llvm::GlobalValue::<wbr>LinkOnceODRLinkage, Init, TypesVarName);<br>
+      GV->setComdat(TheModule.<wbr>getOrInsertComdat(<wbr>TypesVarName));<br>
       GV->setVisibility(llvm::<wbr>GlobalValue::HiddenVisibility)<wbr>;<br>
       TypesGlobal = GV;<br>
     }<br>
@@ -1387,12 +1412,41 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
         CGM.getPointerAlign(), false, llvm::GlobalValue::<wbr>LinkOnceODRLinkage);<br>
     GV->setComdat(TheModule.<wbr>getOrInsertComdat(SelVarName))<wbr>;<br>
     GV->setVisibility(llvm::<wbr>GlobalValue::HiddenVisibility)<wbr>;<br>
-    GV->setSection(SelSection);<br>
+    GV->setSection(sectionName<<wbr>SelectorSection>());<br>
     auto *SelVal = EnforceType(GV, SelectorTy);<br>
     return SelVal;<br>
   }<br>
+  llvm::StructType *emptyStruct = nullptr;<br>
+<br>
+  /// Return pointers to the start and end of a section.  On ELF platforms, we<br>
+  /// use the __start_ and __stop_ symbols that GNU-compatible linkers will set<br>
+  /// to the start and end of section names, as long as those section names are<br>
+  /// valid identifiers and the symbols are referenced but not defined.  On<br>
+  /// Windows, we use the fact that MSVC-compatible linkers will lexically sort<br>
+  /// by subsections and place everything that we want to reference in a middle<br>
+  /// subsection and then insert zero-sized symbols in subsections a and z.<br>
   std::pair<llvm::Constant*,<wbr>llvm::Constant*><br>
   GetSectionBounds(StringRef Section) {<br>
+    if (CGM.getTriple().<wbr>isOSBinFormatCOFF()) {<br>
+      if (emptyStruct == nullptr) {<br>
+        emptyStruct = llvm::StructType::create(<wbr>VMContext, ".objc_section_sentinel");<br>
+        emptyStruct->setBody({}, /*isPacked*/true);<br>
+      }<br>
+      auto ZeroInit = llvm::Constant::getNullValue(<wbr>emptyStruct);<br>
+      auto Sym = [&](StringRef Prefix, StringRef SecSuffix) {<br>
+        auto *Sym = new llvm::GlobalVariable(<wbr>TheModule, emptyStruct,<br>
+            /*isConstant*/false,<br>
+            llvm::GlobalValue::<wbr>LinkOnceODRLinkage, ZeroInit, Prefix +<br>
+            Section);<br>
+        Sym->setVisibility(llvm::<wbr>GlobalValue::HiddenVisibility)<wbr>;<br>
+        Sym->setSection((Section + SecSuffix).str());<br>
+        Sym->setComdat(TheModule.<wbr>getOrInsertComdat((Prefix +<br>
+            Section).str()));<br>
+        Sym->setAlignment(1);<br>
+        return Sym;<br>
+      };<br>
+      return { Sym("__start_", "$a"), Sym("__stop", "$z") };<br>
+    }<br>
     auto *Start = new llvm::GlobalVariable(<wbr>TheModule, PtrTy,<br>
         /*isConstant*/false,<br>
         llvm::GlobalValue::<wbr>ExternalLinkage, nullptr, StringRef("__start_") +<br>
@@ -1405,6 +1459,9 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
     Stop->setVisibility(llvm::<wbr>GlobalValue::HiddenVisibility)<wbr>;<br>
     return { Start, Stop };<br>
   }<br>
+  CatchTypeInfo getCatchAllTypeInfo() override {<br>
+    return CGM.getCXXABI().<wbr>getCatchAllTypeInfo();<br>
+  }<br>
   llvm::Function *ModuleInitFunction() override {<br>
     llvm::Function *LoadFunction = llvm::Function::Create(<br>
       llvm::FunctionType::get(llvm::<wbr>Type::getVoidTy(VMContext), false),<br>
@@ -1420,19 +1477,11 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
     ConstantInitBuilder builder(CGM);<br>
     auto InitStructBuilder = builder.beginStruct();<br>
     InitStructBuilder.addInt(<wbr>Int64Ty, 0);<br>
-    auto addSection = [&](const char *section) {<br>
-      auto bounds = GetSectionBounds(section);<br>
+    for (auto *s : SectionsBaseNames) {<br>
+      auto bounds = GetSectionBounds(s);<br>
       InitStructBuilder.add(bounds.<wbr>first);<br>
       InitStructBuilder.add(bounds.<wbr>second);<br>
     };<br>
-    addSection(SelSection);<br>
-    addSection(ClsSection);<br>
-    addSection(ClsRefSection);<br>
-    addSection(CatSection);<br>
-    addSection(ProtocolSection);<br>
-    addSection(ProtocolRefSection)<wbr>;<br>
-    addSection(ClassAliasSection);<br>
-    addSection(<wbr>ConstantStringSection);<br>
     auto *InitStruct = InitStructBuilder.<wbr>finishAndCreateGlobal(".objc_<wbr>init",<br>
         CGM.getPointerAlign(), false, llvm::GlobalValue::<wbr>LinkOnceODRLinkage);<br>
     InitStruct->setVisibility(<wbr>llvm::GlobalValue::<wbr>HiddenVisibility);<br>
@@ -1451,18 +1500,23 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
     // Check that this hasn't been renamed.  This shouldn't happen, because<br>
     // this function should be called precisely once.<br>
     assert(InitVar->getName() == ".objc_ctor");<br>
-    InitVar->setSection(".ctors");<br>
+    // In Windows, initialisers are sorted by the suffix.  XCL is for library<br>
+    // initialisers, which run before user initialisers.  We are running<br>
+    // Objective-C loads at the end of library load.  This means +load methods<br>
+    // will run before any other static constructors, but that static<br>
+    // constructors can see a fully initialised Objective-C state.<br>
+    if (CGM.getTriple().<wbr>isOSBinFormatCOFF())<br>
+        InitVar->setSection(".CRT$<wbr>XCLz");<br>
+    else<br>
+      InitVar->setSection(".ctors");<br>
     InitVar->setVisibility(llvm::<wbr>GlobalValue::HiddenVisibility)<wbr>;<br>
     InitVar->setComdat(TheModule.<wbr>getOrInsertComdat(".objc_ctor"<wbr>));<br>
-    CGM.addCompilerUsedGlobal(<wbr>InitVar);<br>
+    CGM.addUsedGlobal(InitVar);<br>
     for (auto *C : Categories) {<br>
       auto *Cat = cast<llvm::GlobalVariable>(C-><wbr>stripPointerCasts());<br>
-      Cat->setSection(CatSection);<br>
+      Cat->setSection(sectionName<<wbr>CategorySection>());<br>
       CGM.addUsedGlobal(Cat);<br>
     }<br>
-    // Add a null value fore each special section so that we can always<br>
-    // guarantee that the _start and _stop symbols will exist and be<br>
-    // meaningful.<br>
     auto createNullGlobal = [&](StringRef Name, ArrayRef<llvm::Constant*> Init,<br>
         StringRef Section) {<br>
       auto nullBuilder = builder.beginStruct();<br>
@@ -1476,38 +1530,48 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
       CGM.addUsedGlobal(GV);<br>
       return GV;<br>
     };<br>
-    createNullGlobal(".objc_null_<wbr>selector", {NULLPtr, NULLPtr}, SelSection);<br>
-    if (Categories.empty())<br>
-      createNullGlobal(".objc_null_<wbr>category", {NULLPtr, NULLPtr,<br>
-                    NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr}, CatSection);<br>
-    if (!EmittedClass) {<br>
-      createNullGlobal(".objc_null_<wbr>cls_init_ref", NULLPtr, ClsSection);<br>
-      createNullGlobal(".objc_null_<wbr>class_ref", { NULLPtr, NULLPtr },<br>
-          ClsRefSection);<br>
-    }<br>
-    if (!EmittedProtocol)<br>
-      createNullGlobal(".objc_null_<wbr>protocol", {NULLPtr, NULLPtr, NULLPtr,<br>
-          NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr,<br>
-          NULLPtr}, ProtocolSection);<br>
-    if (!EmittedProtocolRef)<br>
-      createNullGlobal(".objc_null_<wbr>protocol_ref", {NULLPtr}, ProtocolRefSection);<br>
-    if (!ClassAliases.empty())<br>
-      for (auto clsAlias : ClassAliases)<br>
-        createNullGlobal(std::string("<wbr>.objc_class_alias") +<br>
-            clsAlias.second, { MakeConstantString(clsAlias.<wbr>second),<br>
-            GetClassVar(clsAlias.first) }, ClassAliasSection);<br>
-    else<br>
-      createNullGlobal(".objc_null_<wbr>class_alias", { NULLPtr, NULLPtr },<br>
-          ClassAliasSection);<br>
-    if (ConstantStrings.empty()) {<br>
-      auto i32Zero = llvm::ConstantInt::get(<wbr>Int32Ty, 0);<br>
-      createNullGlobal(".objc_null_<wbr>constant_string", { NULLPtr, i32Zero,<br>
-          i32Zero, i32Zero, i32Zero, NULLPtr }, ConstantStringSection);<br>
+    for (auto clsAlias : ClassAliases)<br>
+      createNullGlobal(std::string("<wbr>.objc_class_alias") +<br>
+          clsAlias.second, { MakeConstantString(clsAlias.<wbr>second),<br>
+          GetClassVar(clsAlias.first) }, sectionName<ClassAliasSection><wbr>());<br>
+    // On ELF platforms, add a null value for each special section so that we<br>
+    // can always guarantee that the _start and _stop symbols will exist and be<br>
+    // meaningful.  This is not required on COFF platforms, where our start and<br>
+    // stop symbols will create the section.<br>
+    if (!CGM.getTriple().<wbr>isOSBinFormatCOFF()) {<br>
+      createNullGlobal(".objc_null_<wbr>selector", {NULLPtr, NULLPtr},<br>
+          sectionName<SelectorSection>()<wbr>);<br>
+      if (Categories.empty())<br>
+        createNullGlobal(".objc_null_<wbr>category", {NULLPtr, NULLPtr,<br>
+                      NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr},<br>
+            sectionName<CategorySection>()<wbr>);<br>
+      if (!EmittedClass) {<br>
+        createNullGlobal(".objc_null_<wbr>cls_init_ref", NULLPtr,<br>
+            sectionName<<wbr>ClassReferenceSection>());<br>
+        createNullGlobal(".objc_null_<wbr>class_ref", { NULLPtr, NULLPtr },<br>
+            sectionName<<wbr>ClassReferenceSection>());<br>
+      }<br>
+      if (!EmittedProtocol)<br>
+        createNullGlobal(".objc_null_<wbr>protocol", {NULLPtr, NULLPtr, NULLPtr,<br>
+            NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr, NULLPtr,<br>
+            NULLPtr}, sectionName<ProtocolSection>()<wbr>);<br>
+      if (!EmittedProtocolRef)<br>
+        createNullGlobal(".objc_null_<wbr>protocol_ref", {NULLPtr},<br>
+            sectionName<<wbr>ProtocolReferenceSection>());<br>
+      if (ClassAliases.empty())<br>
+        createNullGlobal(".objc_null_<wbr>class_alias", { NULLPtr, NULLPtr },<br>
+            sectionName<ClassAliasSection><wbr>());<br>
+      if (ConstantStrings.empty()) {<br>
+        auto i32Zero = llvm::ConstantInt::get(<wbr>Int32Ty, 0);<br>
+        createNullGlobal(".objc_null_<wbr>constant_string", { NULLPtr, i32Zero,<br>
+            i32Zero, i32Zero, i32Zero, NULLPtr },<br>
+            sectionName<<wbr>ConstantStringSection>());<br>
+      }<br>
     }<br>
     ConstantStrings.clear();<br>
     Categories.clear();<br>
     Classes.clear();<br>
-    return nullptr;//CGObjCGNU::<wbr>ModuleInitFunction();<br>
+    return nullptr;<br>
   }<br>
   /// In the v2 ABI, ivar offset variables use the type encoding in their name<br>
   /// to trigger linker failures if the types don't match.<br>
@@ -1774,7 +1838,7 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
     }<br>
<br>
     auto *classRefSymbol = GetClassVar(className);<br>
-    classRefSymbol->setSection(<wbr>ClsRefSection);<br>
+    classRefSymbol->setSection(<wbr>sectionName<<wbr>ClassReferenceSection>());<br>
     classRefSymbol-><wbr>setInitializer(llvm::<wbr>ConstantExpr::getBitCast(<wbr>classStruct, IdTy));<br>
<br>
<br>
@@ -1805,7 +1869,7 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
     auto classInitRef = new llvm::GlobalVariable(<wbr>TheModule,<br>
         classStruct->getType(), false, llvm::GlobalValue::<wbr>ExternalLinkage,<br>
         classStruct, "._OBJC_INIT_CLASS_" + className);<br>
-    classInitRef->setSection(<wbr>ClsSection);<br>
+    classInitRef->setSection(<wbr>sectionName<ClassSection>());<br>
     CGM.addUsedGlobal(<wbr>classInitRef);<br>
<br>
     EmittedClass = true;<br>
@@ -1829,6 +1893,18 @@ class CGObjCGNUstep2 : public CGObjCGNUs<br>
<br>
 };<br>
<br>
+const char *const CGObjCGNUstep2::<wbr>SectionsBaseNames[8] =<br>
+{<br>
+"__objc_selectors",<br>
+"__objc_classes",<br>
+"__objc_class_refs",<br>
+"__objc_cats",<br>
+"__objc_protocols",<br>
+"__objc_protocol_refs",<br>
+"__objc_class_aliases",<br>
+"__objc_constant_string"<br>
+};<br>
+<br>
 /// Support for the ObjFW runtime.<br>
 class CGObjCObjFW: public CGObjCGNU {<br>
 protected:<br>
@@ -1931,6 +2007,8 @@ CGObjCGNU::CGObjCGNU(<wbr>CodeGenModule &cgm,<br>
     ProtocolVersion(<wbr>protocolClassVersion), ClassABIVersion(classABI) {<br>
<br>
   msgSendMDKind = VMContext.getMDKindID("<wbr>GNUObjCMessageSend");<br>
+  usesSEHExceptions =<br>
+      cgm.getContext().<wbr>getTargetInfo().getTriple().<wbr>isWindowsMSVCEnvironment();<br>
<br>
   CodeGenTypes &Types = CGM.getTypes();<br>
   IntTy = cast<llvm::IntegerType>(<br>
@@ -2186,6 +2264,9 @@ llvm::Constant *CGObjCGNU::GetEHType(Qua<br>
 }<br>
<br>
 llvm::Constant *CGObjCGNUstep::GetEHType(<wbr>QualType T) {<br>
+  if (usesSEHExceptions)<br>
+    return CGM.getCXXABI().<wbr>getAddrOfRTTIDescriptor(T);<br>
+<br>
   if (!CGM.getLangOpts().CPlusPlus)<br>
     return CGObjCGNU::GetEHType(T);<br>
<br>
@@ -3726,6 +3807,7 @@ void CGObjCGNU::EmitThrowStmt(<wbr>CodeGenFun<br>
                               const ObjCAtThrowStmt &S,<br>
                               bool ClearInsertionPoint) {<br>
   llvm::Value *ExceptionAsObject;<br>
+  bool isRethrow = false;<br>
<br>
   if (const Expr *ThrowExpr = S.getThrowExpr()) {<br>
     llvm::Value *Exception = CGF.EmitObjCThrowOperand(<wbr>ThrowExpr);<br>
@@ -3734,11 +3816,24 @@ void CGObjCGNU::EmitThrowStmt(<wbr>CodeGenFun<br>
     assert((!CGF.ObjCEHValueStack.<wbr>empty() && CGF.ObjCEHValueStack.back()) &&<br>
            "Unexpected rethrow outside @catch block.");<br>
     ExceptionAsObject = CGF.ObjCEHValueStack.back();<br>
+    isRethrow = true;<br>
+  }<br>
+  if (isRethrow && usesSEHExceptions) {<br>
+    // For SEH, ExceptionAsObject may be undef, because the catch handler is<br>
+    // not passed it for catchalls and so it is not visible to the catch<br>
+    // funclet.  The real thrown object will still be live on the stack at this<br>
+    // point and will be rethrown.  If we are explicitly rethrowing the object<br>
+    // that was passed into the `@catch` block, then this code path is not<br>
+    // reached and we will instead call `objc_exception_throw` with an explicit<br>
+    // argument.<br>
+    CGF.EmitRuntimeCallOrInvoke(<wbr>ExceptionReThrowFn).<wbr>setDoesNotReturn();<br>
+  }<br>
+  else {<br>
+    ExceptionAsObject = CGF.Builder.CreateBitCast(<wbr>ExceptionAsObject, IdTy);<br>
+    llvm::CallSite Throw =<br>
+        CGF.EmitRuntimeCallOrInvoke(<wbr>ExceptionThrowFn, ExceptionAsObject);<br>
+    Throw.setDoesNotReturn();<br>
   }<br>
-  ExceptionAsObject = CGF.Builder.CreateBitCast(<wbr>ExceptionAsObject, IdTy);<br>
-  llvm::CallSite Throw =<br>
-      CGF.EmitRuntimeCallOrInvoke(<wbr>ExceptionThrowFn, ExceptionAsObject);<br>
-  Throw.setDoesNotReturn();<br>
   CGF.Builder.CreateUnreachable(<wbr>);<br>
   if (ClearInsertionPoint)<br>
     CGF.Builder.<wbr>ClearInsertionPoint();<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.cpp?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.cpp?rev=339428&<wbr>r1=339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.cpp Fri Aug 10 05:53:13 2018<br>
@@ -15,6 +15,7 @@<br>
<br>
 #include "CGObjCRuntime.h"<br>
 #include "CGCleanup.h"<br>
+#include "CGCXXABI.h"<br>
 #include "CGRecordLayout.h"<br>
 #include "CodeGenFunction.h"<br>
 #include "CodeGenModule.h"<br>
@@ -22,6 +23,7 @@<br>
 #include "clang/AST/StmtObjC.h"<br>
 #include "clang/CodeGen/CGFunctionInfo.<wbr>h"<br>
 #include "llvm/IR/CallSite.h"<br>
+#include "llvm/Support/SaveAndRestore.<wbr>h"<br>
<br>
 using namespace clang;<br>
 using namespace CodeGen;<br>
@@ -120,6 +122,8 @@ namespace {<br>
     const Stmt *Body;<br>
     llvm::BasicBlock *Block;<br>
     llvm::Constant *TypeInfo;<br>
+    /// Flags used to differentiate cleanups and catchalls in Windows SEH<br>
+    unsigned Flags;<br>
   };<br>
<br>
   struct CallObjCEndCatch final : EHScopeStack::Cleanup {<br>
@@ -148,13 +152,17 @@ void CGObjCRuntime::<wbr>EmitTryCatchStmt(Cod<br>
   if (S.getNumCatchStmts())<br>
     Cont = CGF.getJumpDestInCurrentScope(<wbr>"eh.cont");<br>
<br>
+  bool useFunclets = EHPersonality::get(CGF).<wbr>usesFuncletPads();<br>
+<br>
   CodeGenFunction::FinallyInfo FinallyInfo;<br>
-  if (const ObjCAtFinallyStmt *Finally = S.getFinallyStmt())<br>
-    FinallyInfo.enter(CGF, Finally->getFinallyBody(),<br>
-                      beginCatchFn, endCatchFn, exceptionRethrowFn);<br>
+  if (!useFunclets)<br>
+    if (const ObjCAtFinallyStmt *Finally = S.getFinallyStmt())<br>
+      FinallyInfo.enter(CGF, Finally->getFinallyBody(),<br>
+                        beginCatchFn, endCatchFn, exceptionRethrowFn);<br>
<br>
   SmallVector<CatchHandler, 8> Handlers;<br>
<br>
+<br>
   // Enter the catch, if there is one.<br>
   if (S.getNumCatchStmts()) {<br>
     for (unsigned I = 0, N = S.getNumCatchStmts(); I != N; ++I) {<br>
@@ -166,10 +174,13 @@ void CGObjCRuntime::<wbr>EmitTryCatchStmt(Cod<br>
       Handler.Variable = CatchDecl;<br>
       Handler.Body = CatchStmt->getCatchBody();<br>
       Handler.Block = CGF.createBasicBlock("catch");<br>
+      Handler.Flags = 0;<br>
<br>
       // @catch(...) always matches.<br>
       if (!CatchDecl) {<br>
-        Handler.TypeInfo = nullptr; // catch-all<br>
+        auto catchAll = getCatchAllTypeInfo();<br>
+        Handler.TypeInfo = catchAll.RTTI;<br>
+        Handler.Flags = catchAll.Flags;<br>
         // Don't consider any other catches.<br>
         break;<br>
       }<br>
@@ -179,9 +190,31 @@ void CGObjCRuntime::<wbr>EmitTryCatchStmt(Cod<br>
<br>
     EHCatchScope *Catch = CGF.EHStack.pushCatch(<wbr>Handlers.size());<br>
     for (unsigned I = 0, E = Handlers.size(); I != E; ++I)<br>
-      Catch->setHandler(I, Handlers[I].TypeInfo, Handlers[I].Block);<br>
+      Catch->setHandler(I, { Handlers[I].TypeInfo, Handlers[I].Flags }, Handlers[I].Block);<br>
   }<br>
<br>
+  if (useFunclets)<br>
+    if (const ObjCAtFinallyStmt *Finally = S.getFinallyStmt()) {<br>
+        CodeGenFunction HelperCGF(CGM, /*suppressNewContext=*/true);<br>
+        if (!CGF.CurSEHParent)<br>
+            CGF.CurSEHParent = cast<NamedDecl>(CGF.<wbr>CurFuncDecl);<br>
+        // Outline the finally block.<br>
+        const Stmt *FinallyBlock = Finally->getFinallyBody();<br>
+        HelperCGF.<wbr>startOutlinedSEHHelper(CGF, /*isFilter*/false, FinallyBlock);<br>
+<br>
+        // Emit the original filter expression, convert to i32, and return.<br>
+        HelperCGF.EmitStmt(<wbr>FinallyBlock);<br>
+<br>
+        HelperCGF.FinishFunction(<wbr>FinallyBlock->getLocEnd());<br>
+<br>
+        llvm::Function *FinallyFunc = HelperCGF.CurFn;<br>
+<br>
+<br>
+        // Push a cleanup for __finally blocks.<br>
+        CGF.pushSEHCleanup(<wbr>NormalAndEHCleanup, FinallyFunc);<br>
+    }<br>
+<br>
+  <br>
   // Emit the try body.<br>
   CGF.EmitStmt(S.getTryBody());<br>
<br>
@@ -197,6 +230,13 @@ void CGObjCRuntime::<wbr>EmitTryCatchStmt(Cod<br>
     CatchHandler &Handler = Handlers[I];<br>
<br>
     CGF.EmitBlock(Handler.Block);<br>
+    llvm::CatchPadInst *CPI = nullptr;<br>
+    SaveAndRestore<llvm::<wbr>Instruction *> RestoreCurrentFuncletPad(CGF.<wbr>CurrentFuncletPad);<br>
+    if (useFunclets)<br>
+      if ((CPI = dyn_cast_or_null<llvm::<wbr>CatchPadInst>(Handler.Block-><wbr>getFirstNonPHI()))) {<br>
+        CGF.CurrentFuncletPad = CPI;<br>
+        CPI->setOperand(2, CGF.getExceptionSlot().<wbr>getPointer());<br>
+      }<br>
     llvm::Value *RawExn = CGF.getExceptionFromSlot();<br>
<br>
     // Enter the catch.<br>
@@ -223,6 +263,8 @@ void CGObjCRuntime::<wbr>EmitTryCatchStmt(Cod<br>
       CGF.EmitAutoVarDecl(*<wbr>CatchParam);<br>
       EmitInitOfCatchParam(CGF, CastExn, CatchParam);<br>
     }<br>
+    if (CPI)<br>
+        CGF.EHStack.pushCleanup<<wbr>CatchRetScope>(NormalCleanup, CPI);<br>
<br>
     CGF.ObjCEHValueStack.push_<wbr>back(Exn);<br>
     CGF.EmitStmt(Handler.Body);<br>
@@ -232,13 +274,13 @@ void CGObjCRuntime::<wbr>EmitTryCatchStmt(Cod<br>
     cleanups.ForceCleanup();<br>
<br>
     CGF.EmitBranchThroughCleanup(<wbr>Cont);<br>
-  }<br>
+  }  <br>
<br>
   // Go back to the try-statement fallthrough.<br>
   CGF.Builder.restoreIP(SavedIP)<wbr>;<br>
<br>
   // Pop out of the finally.<br>
-  if (S.getFinallyStmt())<br>
+  if (!useFunclets && S.getFinallyStmt())<br>
     FinallyInfo.exit(CGF);<br>
<br>
   if (Cont.isValid())<br>
@@ -277,7 +319,7 @@ namespace {<br>
       : SyncExitFn(SyncExitFn), SyncArg(SyncArg) {}<br>
<br>
     void Emit(CodeGenFunction &CGF, Flags flags) override {<br>
-      CGF.Builder.CreateCall(<wbr>SyncExitFn, SyncArg)->setDoesNotThrow();<br>
+      CGF.EmitNounwindRuntimeCall(<wbr>SyncExitFn, SyncArg);<br>
     }<br>
   };<br>
 }<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCRuntime.h?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.h?rev=339428&r1=<wbr>339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.h (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CGObjCRuntime.h Fri Aug 10 05:53:13 2018<br>
@@ -17,6 +17,7 @@<br>
 #define LLVM_CLANG_LIB_CODEGEN_<wbr>CGOBJCRUNTIME_H<br>
 #include "CGBuilder.h"<br>
 #include "CGCall.h"<br>
+#include "CGCleanup.h"<br>
 #include "CGValue.h"<br>
 #include "clang/AST/DeclObjC.h"<br>
 #include "clang/Basic/IdentifierTable.<wbr>h" // Selector<br>
@@ -141,6 +142,8 @@ public:<br>
   /// error to Sema.<br>
   virtual llvm::Constant *GetEHType(QualType T) = 0;<br>
<br>
+  virtual CatchTypeInfo getCatchAllTypeInfo() { return { nullptr, 0 }; }<br>
+<br>
   /// Generate a constant string object.<br>
   virtual ConstantAddress GenerateConstantString(const StringLiteral *) = 0;<br>
<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h?rev=339428&<wbr>r1=339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CodeGenFunction.h Fri Aug 10 05:53:13 2018<br>
@@ -470,7 +470,7 @@ public:<br>
   /// potentially set the return value.<br>
   bool SawAsmBlock = false;<br>
<br>
-  const FunctionDecl *CurSEHParent = nullptr;<br>
+  const NamedDecl *CurSEHParent = nullptr;<br>
<br>
   /// True if the current function is an outlined SEH helper. This can be a<br>
   /// finally block or filter expression.<br>
@@ -2878,6 +2878,8 @@ public:<br>
   void EnterSEHTryStmt(const SEHTryStmt &S);<br>
   void ExitSEHTryStmt(const SEHTryStmt &S);<br>
<br>
+  void pushSEHCleanup(CleanupKind kind,<br>
+                      llvm::Function *FinallyFunc);<br>
   void startOutlinedSEHHelper(<wbr>CodeGenFunction &ParentCGF, bool IsFilter,<br>
                               const Stmt *OutlinedStmt);<br>
<br>
<br>
Modified: cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp?rev=<wbr>339428&r1=339427&r2=339428&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp (original)<br>
+++ cfe/trunk/lib/Driver/<wbr>ToolChains/Clang.cpp Fri Aug 10 05:53:13 2018<br>
@@ -4915,7 +4915,8 @@ ObjCRuntime Clang::AddObjCRuntimeArgs(co<br>
     }<br>
     if ((runtime.getKind() == ObjCRuntime::GNUstep) &&<br>
         (runtime.getVersion() >= VersionTuple(2, 0)))<br>
-      if (!getToolChain().getTriple().<wbr>isOSBinFormatELF()) {<br>
+      if (!getToolChain().getTriple().<wbr>isOSBinFormatELF() &&<br>
+          !getToolChain().getTriple().<wbr>isOSBinFormatCOFF()) {<br>
         getToolChain().getDriver().<wbr>Diag(<br>
             diag::err_drv_gnustep_objc_<wbr>runtime_incompatible_binary)<br>
           << runtime.getVersion().getMajor(<wbr>);<br>
<br>
Modified: cfe/trunk/test/CodeGenObjC/<wbr>gnu-init.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/gnu-init.m?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenObjC/gnu-init.m?rev=<wbr>339428&r1=339427&r2=339428&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenObjC/<wbr>gnu-init.m (original)<br>
+++ cfe/trunk/test/CodeGenObjC/<wbr>gnu-init.m Fri Aug 10 05:53:13 2018<br>
@@ -1,4 +1,5 @@<br>
 // RUN: %clang_cc1 -triple x86_64-unknown-freebsd -S -emit-llvm -fobjc-runtime=gnustep-2.0 -o - %s | FileCheck %s -check-prefix=CHECK-NEW<br>
+// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -S -emit-llvm -fobjc-runtime=gnustep-2.0 -o - %s | FileCheck %s -check-prefix=CHECK-WIN<br>
 // RUN: %clang_cc1 -triple x86_64-unknown-freebsd -S -emit-llvm -fobjc-runtime=gnustep-1.8 -o - %s | FileCheck %s -check-prefix=CHECK-OLD<br>
<br>
 // Almost minimal Objective-C file, check that it emits calls to the correct<br>
@@ -49,9 +50,9 @@<br>
 // CHECK-NEW: @.objc_null_class_alias = linkonce_odr hidden global { i8*, i8* } zeroinitializer, section "__objc_class_aliases", comdat, align 8<br>
 // CHECK-NEW: @.objc_null_constant_string = linkonce_odr hidden global { i8*, i32, i32, i32, i32, i8* } zeroinitializer, section "__objc_constant_string", comdat, align 8<br>
 // Make sure that the null symbols are not going to be removed, even by linking.<br>
-// CHECK-NEW: @llvm.used = appending global [7 x i8*] [i8* bitcast ({ { i8*, i8*, i8*, i64, i64, i64, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i64, i8* }*, i8*, i8*, i64, i64, i64, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i64, i8* }** @._OBJC_INIT_CLASS_X to i8*), i8* bitcast ({ i8*, i8* }* @.objc_null_selector to i8*), i8* bitcast ({ i8*, i8*, i8*, i8*, i8*, i8*, i8* }* @.objc_null_category to i8*), i8* bitcast ({ i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8* }* @.objc_null_protocol to i8*), i8* bitcast ({ i8* }* @.objc_null_protocol_ref to i8*), i8* bitcast ({ i8*, i8* }* @.objc_null_class_alias to i8*), i8* bitcast ({ i8*, i32, i32, i32, i32, i8* }* @.objc_null_constant_string to i8*)], section "llvm.metadata"<br>
+// CHECK-NEW: @llvm.used = appending global [8 x i8*] [i8* bitcast ({ { i8*, i8*, i8*, i64, i64, i64, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i64, i8* }*, i8*, i8*, i64, i64, i64, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i64, i8* }** @._OBJC_INIT_CLASS_X to i8*), i8* bitcast (void ()** @.objc_ctor to i8*), i8* bitcast ({ i8*, i8* }* @.objc_null_selector to i8*), i8* bitcast ({ i8*, i8*, i8*, i8*, i8*, i8*, i8* }* @.objc_null_category to i8*), i8* bitcast ({ i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8* }* @.objc_null_protocol to i8*), i8* bitcast ({ i8* }* @.objc_null_protocol_ref to i8*), i8* bitcast ({ i8*, i8* }* @.objc_null_class_alias to i8*), i8* bitcast ({ i8*, i32, i32, i32, i32, i8* }* @.objc_null_constant_string to i8*)], section "llvm.metadata"<br>
 // Make sure that the load function and the reference to it are marked as used.<br>
-// CHECK-NEW: @llvm.compiler.used = appending global [2 x i8*] [i8* bitcast (void ()* @.objcv2_load_function to i8*), i8* bitcast (void ()** @.objc_ctor to i8*)], section "llvm.metadata"<br>
+// CHECK-NEW: @llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (void ()* @.objcv2_load_function to i8*)], section "llvm.metadata"<br>
<br>
 // Check that we emit the load function in a comdat and that it does the right thing.<br>
 // CHECK-NEW: define linkonce_odr hidden void @.objcv2_load_function() comdat {<br>
@@ -67,3 +68,37 @@<br>
 // CHECK-OLD-NEXT: entry:<br>
 // CHECK-OLD-NEXT: call void ({ i64, i64, i8*, { i64, { i8*, i8* }*, i16, i16, [4 x i8*] }* }*, ...) @__objc_exec_class({ i64, i64, i8*, { i64, { i8*, i8* }*, i16, i16, [4 x i8*] }* }* @4)<br>
<br>
+<br>
+<br>
+// Make sure all of our section boundary variables are emitted correctly.<br>
+// CHECK-WIN: @__start___objc_selectors = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_selectors$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_selectors = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_selectors$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_classes = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_classes$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_classes = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_classes$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_class_refs = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_class_refs$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_class_refs = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_class_refs$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_cats = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_cats$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_cats = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_cats$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_protocols = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_protocols$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_protocols = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_protocols$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_protocol_refs = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_protocol_refs$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_protocol_refs = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_protocol_refs$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_class_aliases = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_class_aliases$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_class_aliases = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_class_aliases$z", comdat, align 1<br>
+// CHECK-WIN: @__start___objc_constant_<wbr>string = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_constant_string$a", comdat, align 1<br>
+// CHECK-WIN: @__stop__objc_constant_string = linkonce_odr hidden global %.objc_section_sentinel zeroinitializer, section "__objc_constant_string$z", comdat, align 1<br>
+// CHECK-WIN: @.objc_init = linkonce_odr hidden global { i64, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel*, %.objc_section_sentinel* } { i64 0, %.objc_section_sentinel* @__start___objc_selectors, %.objc_section_sentinel* @__stop__objc_selectors, %.objc_section_sentinel* @__start___objc_classes, %.objc_section_sentinel* @__stop__objc_classes, %.objc_section_sentinel* @__start___objc_class_refs, %.objc_section_sentinel* @__stop__objc_class_refs, %.objc_section_sentinel* @__start___objc_cats, %.objc_section_sentinel* @__stop__objc_cats, %.objc_section_sentinel* @__start___objc_protocols, %.objc_section_sentinel* @__stop__objc_protocols, %.objc_section_sentinel* @__start___objc_protocol_refs, %.objc_section_sentinel* @__stop__objc_protocol_refs, %.objc_section_sentinel* @__start___objc_class_aliases, %.objc_section_sentinel* @__stop__objc_class_aliases, %.objc_section_sentinel* @__start___objc_constant_<wbr>string, %.objc_section_sentinel* @__stop__objc_constant_string }, comdat, align 8<br>
+<br>
+// Make sure our init variable is in the correct section for late library init.<br>
+// CHECK-WIN: @.objc_ctor = linkonce hidden constant void ()* @.objcv2_load_function, section ".CRT$XCLz", comdat<br>
+<br>
+// We shouldn't have emitted any null placeholders on Windows.<br>
+// CHECK-WIN: @llvm.used = appending global [2 x i8*] [i8* bitcast ({ { i8*, i8*, i8*, i32, i32, i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i32, i8* }*, i8*, i8*, i32, i32, i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i32, i8* }** @._OBJC_INIT_CLASS_X to i8*), i8* bitcast (void ()** @.objc_ctor to i8*)], section "llvm.metadata"<br>
+// CHECK-WIN: @llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (void ()* @.objcv2_load_function to i8*)], section "llvm.metadata"<br>
+<br>
+// Check our load function is in a comdat.<br>
+// CHECK-WIN: define linkonce_odr hidden void @.objcv2_load_function() comdat {<br>
+<br>
+// Make sure we have dllimport on the load function<br>
+// CHECK-WIN: declare dllimport void @__objc_load<br>
+<br>
<br>
Modified: cfe/trunk/test/CodeGenObjC/<wbr>gnustep2-proto.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/gnustep2-proto.m?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenObjC/gnustep2-proto.m?<wbr>rev=339428&r1=339427&r2=<wbr>339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenObjC/<wbr>gnustep2-proto.m (original)<br>
+++ cfe/trunk/test/CodeGenObjC/<wbr>gnustep2-proto.m Fri Aug 10 05:53:13 2018<br>
@@ -22,11 +22,11 @@<br>
<br>
 // Check that we're emitting the protocol and a correctly initialised<br>
 // indirection variable.<br>
-// CHECK: @._OBJC_PROTOCOL_X = global <br>
+// CHECK: @._OBJC_PROTOCOL_X = global<br>
 // CHECK-SAME: , section "__objc_protocols", comdat, align 8<br>
-// CHECK: @._OBJC_REF_PROTOCOL_X = global <br>
+// CHECK: @._OBJC_REF_PROTOCOL_X = linkonce_odr global<br>
 // CHECK-SAME: @._OBJC_PROTOCOL_X<br>
-// CHECK-SAME: , section "__objc_protocol_refs", align 8<br>
+// CHECK-SAME: , section "__objc_protocol_refs", comdat, align 8<br>
<br>
<br>
 // Check that we load from the indirection variable on protocol references.<br>
<br>
Modified: cfe/trunk/test/CodeGenObjCXX/<a href="http://arc-marker-funclet.mm" rel="noreferrer" target="_blank">a<wbr>rc-marker-funclet.mm</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/arc-marker-funclet.mm?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenObjCXX/arc-marker-<wbr>funclet.mm?rev=339428&r1=<wbr>339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenObjCXX/<a href="http://arc-marker-funclet.mm" rel="noreferrer" target="_blank">a<wbr>rc-marker-funclet.mm</a> (original)<br>
+++ cfe/trunk/test/CodeGenObjCXX/<a href="http://arc-marker-funclet.mm" rel="noreferrer" target="_blank">a<wbr>rc-marker-funclet.mm</a> Fri Aug 10 05:53:13 2018<br>
@@ -10,7 +10,7 @@ void g() {<br>
   }<br>
 }<br>
<br>
-// CHECK: call i8* @"?f@@YAPAUobjc_object@@XZ"() [ "funclet"(token %1) ]<br>
+// CHECK: call i8* @"?f@@YAPAU.objc_object@@XZ"() [ "funclet"(token %1) ]<br>
 // CHECK-NEXT: call void asm sideeffect "movl{{.*}}%ebp, %ebp{{.*}}", ""() [ "funclet"(token %1) ]<br>
<br>
 // The corresponding f() call was invoked from the entry basic block.<br>
<br>
Modified: cfe/trunk/test/CodeGenObjCXX/<a href="http://microsoft-abi-arc-param-order.mm" rel="noreferrer" target="_blank">m<wbr>icrosoft-abi-arc-param-order.<wbr>mm</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/microsoft-abi-arc-param-order.mm?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenObjCXX/microsoft-abi-<wbr>arc-param-order.mm?rev=339428&<wbr>r1=339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenObjCXX/<a href="http://microsoft-abi-arc-param-order.mm" rel="noreferrer" target="_blank">m<wbr>icrosoft-abi-arc-param-order.<wbr>mm</a> (original)<br>
+++ cfe/trunk/test/CodeGenObjCXX/<a href="http://microsoft-abi-arc-param-order.mm" rel="noreferrer" target="_blank">m<wbr>icrosoft-abi-arc-param-order.<wbr>mm</a> Fri Aug 10 05:53:13 2018<br>
@@ -9,7 +9,7 @@ struct A {<br>
<br>
 // Verify that we destruct things from left to right in the MS C++ ABI: a, b, c, d.<br>
 //<br>
-// CHECK-LABEL: define dso_local void @"?test_arc_order@@YAXUA@@<wbr>PAUobjc_object@@01@Z"<br>
+// CHECK-LABEL: define dso_local void @"?test_arc_order@@YAXUA@@PAU.<wbr>objc_object@@01@Z"<br>
 // CHECK:                       (<{ %struct.A, i8*, %struct.A, i8* }>* inalloca)<br>
 void test_arc_order(A a, id __attribute__((ns_consumed)) b , A c, id __attribute__((ns_consumed)) d) {<br>
   // CHECK: call x86_thiscallcc void @"??1A@@QAE@XZ"(%struct.A* %{{.*}})<br>
<br>
Modified: cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-extensions.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-extensions.mm</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/msabi-objc-extensions.mm?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenObjCXX/msabi-objc-<wbr>extensions.mm?rev=339428&r1=<wbr>339427&r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-extensions.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-extensions.mm</a> (original)<br>
+++ cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-extensions.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-extensions.mm</a> Fri Aug 10 05:53:13 2018<br>
@@ -6,61 +6,61 @@<br>
 @class I;<br>
<br>
 void f(id<P>, id, id<P>, id) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@@@<wbr>PAUobjc_object@@01@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@@@PAU.<wbr>objc_object@@01@Z"<br>
<br>
 void f(id, id<P>, id<P>, id) {}<br>
-// CHECK-LABEL: "?f@@YAXPAUobjc_object@@PAU?$<wbr>objc_object@U?$Protocol@UP@@@_<wbr>_ObjC@@@@10@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU.objc_object@@PAU?$<wbr>.objc_object@U?$Protocol@UP@@@<wbr>__ObjC@@@@10@Z"<br>
<br>
 void f(id<P>, id<P>) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@@@0@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@@@0@Z"<br>
<br>
 void f(id<P>) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@@@@Z"<br>
<br>
 void f(id<P, Q>) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@U?$<wbr>Protocol@UQ@@@2@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_object@U?$<wbr>Protocol@UP@@@__ObjC@@U?$<wbr>Protocol@UQ@@@2@@@@Z"<br>
<br>
 void f(Class<P>) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$objc_class@U?$<wbr>Protocol@UP@@@__ObjC@@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_class@U?$<wbr>Protocol@UP@@@__ObjC@@@@@Z"<br>
<br>
 void f(Class<P, Q>) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$objc_class@U?$<wbr>Protocol@UP@@@__ObjC@@U?$<wbr>Protocol@UQ@@@2@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_class@U?$<wbr>Protocol@UP@@@__ObjC@@U?$<wbr>Protocol@UQ@@@2@@@@Z"<br>
<br>
 void f(I<P> *) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$I@U?$Protocol@UP@<wbr>@@__ObjC@@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_cls_I@U?$<wbr>Protocol@UP@@@__ObjC@@@@@Z"<br>
<br>
 void f(I<P, Q> *) {}<br>
-// CHECK-LABEL: "?f@@YAXPAU?$I@U?$Protocol@UP@<wbr>@@__ObjC@@U?$Protocol@UQ@@@2@@<wbr>@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU?$.objc_cls_I@U?$<wbr>Protocol@UP@@@__ObjC@@U?$<wbr>Protocol@UQ@@@2@@@@Z"<br>
<br>
 template <typename><br>
 struct S {};<br>
<br>
 void f(S<__unsafe_unretained id>) {}<br>
-// CHECK-LABEL: "?f@@YAXU?$S@PAUobjc_object@@@<wbr>@@Z"<br>
+// CHECK-LABEL: "?f@@YAXU?$S@PAU.objc_object@@<wbr>@@@Z"<br>
<br>
 void f(S<__autoreleasing id>) {}<br>
-// CHECK-LABEL: "?f@@YAXU?$S@U?$Autoreleasing@<wbr>PAUobjc_object@@@__ObjC@@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXU?$S@U?$Autoreleasing@<wbr>PAU.objc_object@@@__ObjC@@@@@<wbr>Z"<br>
<br>
 void f(S<__strong id>) {}<br>
-// CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@<wbr>PAUobjc_object@@@__ObjC@@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXU?$S@U?$Strong@PAU.<wbr>objc_object@@@__ObjC@@@@@Z"<br>
<br>
 void f(S<__weak id>) {}<br>
-// CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAUobjc_<wbr>object@@@__ObjC@@@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXU?$S@U?$Weak@PAU.objc_<wbr>object@@@__ObjC@@@@@Z"<br>
<br>
 void w(__weak id) {}<br>
-// CHECK-LABEL: "?w@@YAXPAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?w@@YAXPAU.objc_object@@@Z"<br>
<br>
 void s(__strong id) {}<br>
-// CHECK-LABEL: "?s@@YAXPAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?s@@YAXPAU.objc_object@@@Z"<br>
<br>
 void a(__autoreleasing id) {}<br>
-// CHECK-LABEL: "?a@@YAXPAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?a@@YAXPAU.objc_object@@@Z"<br>
<br>
 void u(__unsafe_unretained id) {}<br>
-// CHECK-LABEL: "?u@@YAXPAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?u@@YAXPAU.objc_object@@@Z"<br>
<br>
 S<__autoreleasing id> g() { return S<__autoreleasing id>(); }<br>
-// CHECK-LABEL: "?g@@YA?AU?$S@U?$<wbr>Autoreleasing@PAUobjc_object@@<wbr>@__ObjC@@@@XZ"<br>
+// CHECK-LABEL: "?g@@YA?AU?$S@U?$<wbr>Autoreleasing@PAU.objc_object@<wbr>@@__ObjC@@@@XZ"<br>
<br>
 __autoreleasing id h() { return nullptr; }<br>
-// CHECK-LABEL: "?h@@YAPAUobjc_object@@XZ"<br>
+// CHECK-LABEL: "?h@@YAPAU.objc_object@@XZ"<br>
<br>
Modified: cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-types.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-types.mm</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjCXX/msabi-objc-types.mm?rev=339428&r1=339427&r2=339428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGenObjCXX/msabi-objc-<wbr>types.mm?rev=339428&r1=339427&<wbr>r2=339428&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-types.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-types.mm</a> (original)<br>
+++ cfe/trunk/test/CodeGenObjCXX/<a href="http://msabi-objc-types.mm" rel="noreferrer" target="_blank">m<wbr>sabi-objc-types.mm</a> Fri Aug 10 05:53:13 2018<br>
@@ -3,166 +3,166 @@<br>
 @class I;<br>
<br>
 id kid;<br>
-// CHECK: @"?kid@@3PAUobjc_object@@A" =  dso_local global<br>
+// CHECK: @"?kid@@3PAU.objc_object@@A" =  dso_local global<br>
<br>
 Class klass;<br>
-// CHECK: @"?klass@@3PAUobjc_class@@A" = dso_local global<br>
+// CHECK: @"?klass@@3PAU.objc_class@@A" = dso_local global<br>
<br>
 I *kI;<br>
-// CHECK: @"?kI@@3PAUI@@A" = dso_local global<br>
+// CHECK: @"?kI@@3PAU.objc_cls_I@@A" = dso_local global<br>
<br>
 void f(I *) {}<br>
-// CHECK-LABEL: "?f@@YAXPAUI@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPAU.objc_cls_I@@@Z"<br>
<br>
 void f(const I *) {}<br>
-// CHECK-LABEL: "?f@@YAXPBUI@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXPBU.objc_cls_I@@@Z"<br>
<br>
 void f(I &) {}<br>
-// CHECK-LABEL: "?f@@YAXAAUI@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXAAU.objc_cls_I@@@Z"<br>
<br>
 void f(const I &) {}<br>
-// CHECK-LABEL: "?f@@YAXABUI@@@Z"<br>
+// CHECK-LABEL: "?f@@YAXABU.objc_cls_I@@@Z"<br>
<br>
 void f(const I &&) {}<br>
-// CHECK-LABEL: "?f@@YAX$$QBUI@@@Z"<br>
+// CHECK-LABEL: "?f@@YAX$$QBU.objc_cls_I@@@Z"<br>
<br>
 void g(id) {}<br>
-// CHECK-LABEL: "?g@@YAXPAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?g@@YAXPAU.objc_object@@@Z"<br>
<br>
 void g(id &) {}<br>
-// CHECK-LABEL: "?g@@YAXAAPAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?g@@YAXAAPAU.objc_object@@@Z"<br>
<br>
 void g(const id &) {}<br>
-// CHECK-LABEL: "?g@@YAXABQAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?g@@YAXABQAU.objc_object@@@Z"<br>
<br>
 void g(id &&) {}<br>
-// CHECK-LABEL: "?g@@YAX$$QAPAUobjc_object@@@<wbr>Z"<br>
+// CHECK-LABEL: "?g@@YAX$$QAPAU.objc_object@@@<wbr>Z"<br>
<br>
 void h(Class) {}<br>
-// CHECK-LABEL: "?h@@YAXPAUobjc_class@@@Z"<br>
+// CHECK-LABEL: "?h@@YAXPAU.objc_class@@@Z"<br>
<br>
 void h(Class &) {}<br>
-// CHECK-LABEL: "?h@@YAXAAPAUobjc_class@@@Z"<br>
+// CHECK-LABEL: "?h@@YAXAAPAU.objc_class@@@Z"<br>
<br>
 void h(const Class &) {}<br>
-// CHECK-LABEL: "?h@@YAXABQAUobjc_class@@@Z"<br>
+// CHECK-LABEL: "?h@@YAXABQAU.objc_class@@@Z"<br>
<br>
 void h(Class &&) {}<br>
-// CHECK-LABEL: "?h@@YAX$$QAPAUobjc_class@@@Z"<br>
+// CHECK-LABEL: "?h@@YAX$$QAPAU.objc_class@@@<wbr>Z"<br>
<br>
 I *i() { return nullptr; }<br>
-// CHECK-LABEL: "?i@@YAPAUI@@XZ"<br>
+// CHECK-LABEL: "?i@@YAPAU.objc_cls_I@@XZ"<br>
<br>
 const I *j() { return nullptr; }<br>
-// CHECK-LABEL: "?j@@YAPBUI@@XZ"<br>
+// CHECK-LABEL: "?j@@YAPBU.objc_cls_I@@XZ"<br>
<br>
 I &k() { return *kI; }<br>
-// CHECK-LABEL: "?k@@YAAAUI@@XZ"<br>
+// CHECK-LABEL: "?k@@YAAAU.objc_cls_I@@XZ"<br>
<br>
 const I &l() { return *kI; }<br>
-// CHECK-LABEL: "?l@@YAABUI@@XZ"<br>
+// CHECK-LABEL: "?l@@YAABU.objc_cls_I@@XZ"<br>
<br>
 void m(const id) {}<br>
-// CHECK-LABEL: "?m@@YAXQAUobjc_object@@@Z"<br>
+// CHECK-LABEL: "?m@@YAXQAU.objc_object@@@Z"<br>
<br>
 void m(const I *) {}<br>
-// CHECK-LABEL: "?m@@YAXPBUI@@@Z"<br>
+// CHECK-LABEL: "?m@@YAXPBU.objc_cls_I@@@Z"<br>
<br>
 void n(SEL) {}<br>
-// CHECK-LABEL: "?n@@YAXPAUobjc_selector@@@Z"<br>
+// CHECK-LABEL: "?n@@YAXPAU.objc_selector@@@Z"<br>
<br>
 void n(SEL *) {}<br>
-// CHECK-LABEL: "?n@@YAXPAPAUobjc_selector@@@<wbr>Z"<br>
+// CHECK-LABEL: "?n@@YAXPAPAU.objc_selector@@@<wbr>Z"<br>
<br>
 void n(const SEL *) {}<br>
-// CHECK-LABEL: "?n@@YAXPBQAUobjc_selector@@@<wbr>Z"<br>
+// CHECK-LABEL: "?n@@YAXPBQAU.objc_selector@@@<wbr>Z"<br>
<br>
 void n(SEL &) {}<br>
-// CHECK-LABEL: "?n@@YAXAAPAUobjc_selector@@@<wbr>Z"<br>
+// CHECK-LABEL: "?n@@YAXAAPAU.objc_selector@@@<wbr>Z"<br>
<br>
 void n(const SEL &) {}<br>
-// CHECK-LABEL: "?n@@YAXABQAUobjc_selector@@@<wbr>Z"<br>
+// CHECK-LABEL: "?n@@YAXABQAU.objc_selector@@@<wbr>Z"<br>
<br>
 void n(SEL &&) {}<br>
-// CHECK-LABEL: "?n@@YAX$$QAPAUobjc_selector@@<wbr>@Z"<br>
+// CHECK-LABEL: "?n@@YAX$$QAPAU.objc_selector@<wbr>@@Z"<br>
<br>
 struct __declspec(dllexport) s {<br>
   struct s &operator=(const struct s &) = delete;<br>
<br>
   void m(I *) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPAUI@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPAU.objc_cls_I@@@Z"<br>
<br>
   void m(const I *) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPBUI@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPBU.objc_cls_I@@@Z"<br>
<br>
   void m(I &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXAAUI@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXAAU.objc_cls_I@@@Z"<br>
<br>
   void m(const I &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXABUI@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXABU.objc_cls_I@@@Z"<br>
<br>
   void m(I &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QAUI@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QAU.objc_cls_I@@@<wbr>Z"<br>
<br>
   void m(const I &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QBUI@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QBU.objc_cls_I@@@<wbr>Z"<br>
<br>
   void m(id) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPAUobjc_object@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPAU.objc_object@@@<wbr>Z"<br>
<br>
   void m(id &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXAAPAUobjc_object@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXAAPAU.objc_object@@<wbr>@Z"<br>
<br>
   void m(id &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QAPAUobjc_object@<wbr>@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QAPAU.objc_<wbr>object@@@Z"<br>
<br>
   void m(const id &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXABQAUobjc_object@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXABQAU.objc_object@@<wbr>@Z"<br>
<br>
   void m(const id &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QBQAUobjc_object@<wbr>@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QBQAU.objc_<wbr>object@@@Z"<br>
<br>
   void m(Class *) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPAPAUobjc_class@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPAPAU.objc_class@@@<wbr>Z"<br>
<br>
   void m(const Class *) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPBQAUobjc_class@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPBQAU.objc_class@@@<wbr>Z"<br>
<br>
   void m(Class) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPAUobjc_class@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPAU.objc_class@@@Z"<br>
<br>
   void m(Class &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXAAPAUobjc_class@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXAAPAU.objc_class@@@<wbr>Z"<br>
<br>
   void m(const Class &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXABQAUobjc_class@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXABQAU.objc_class@@@<wbr>Z"<br>
<br>
   void m(Class &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QAPAUobjc_class@@<wbr>@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QAPAU.objc_class@<wbr>@@Z"<br>
<br>
   void m(const Class &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QBQAUobjc_class@@<wbr>@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QBQAU.objc_class@<wbr>@@Z"<br>
<br>
   void m(SEL) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPAUobjc_selector@@@<wbr>Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPAU.objc_selector@@<wbr>@Z"<br>
<br>
   void m(SEL *) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPAPAUobjc_selector@<wbr>@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPAPAU.objc_<wbr>selector@@@Z"<br>
<br>
   void m(const SEL *) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXPBQAUobjc_selector@<wbr>@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXPBQAU.objc_<wbr>selector@@@Z"<br>
<br>
   void m(SEL &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXAAPAUobjc_selector@<wbr>@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXAAPAU.objc_<wbr>selector@@@Z"<br>
<br>
   void m(const SEL &) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAXABQAUobjc_selector@<wbr>@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAXABQAU.objc_<wbr>selector@@@Z"<br>
<br>
   void m(SEL &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QAPAUobjc_<wbr>selector@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QAPAU.objc_<wbr>selector@@@Z"<br>
<br>
   void m(const SEL &&) {}<br>
-  // CHECK-LABEL: "?m@s@@QAAX$$QBQAUobjc_<wbr>selector@@@Z"<br>
+  // CHECK-LABEL: "?m@s@@QAAX$$QBQAU.objc_<wbr>selector@@@Z"<br>
 };<br>
<br>
 template <typename T><br>
@@ -179,14 +179,14 @@ struct t {<br>
 };<br>
<br>
 template struct t<id>;<br>
-// CHECK-LABEL: "??0?$t@PAUobjc_object@@@@QAA@<wbr>XZ"<br>
+// CHECK-LABEL: "??0?$t@PAU.objc_object@@@@<wbr>QAA@XZ"<br>
<br>
 template struct t<remove_pointer<id>::type>;<br>
-// CHECK-LABEL: "??0?$t@Uobjc_object@@@@QAA@XZ<wbr>"<br>
+// CHECK-LABEL: "??0?$t@U.objc_object@@@@QAA@<wbr>XZ"<br>
<br>
 template struct t<SEL>;<br>
-// CHECK-LABEL: "??0?$t@PAUobjc_selector@@@@<wbr>QAA@XZ"<br>
+// CHECK-LABEL: "??0?$t@PAU.objc_selector@@@@<wbr>QAA@XZ"<br>
<br>
 template struct t<remove_pointer<SEL>::type>;<br>
-// CHECK-LABEL: "??0?$t@Uobjc_selector@@@@QAA@<wbr>XZ"<br>
+// CHECK-LABEL: "??0?$t@U.objc_selector@@@@<wbr>QAA@XZ"<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>