Index: utils/TableGen/ClangAttrEmitter.cpp
===================================================================
--- utils/TableGen/ClangAttrEmitter.cpp	(revision 172270)
+++ utils/TableGen/ClangAttrEmitter.cpp	(working copy)
@@ -777,15 +777,19 @@
 
     OS << "\n public:\n";
     OS << "  " << R.getName() << "Attr(SourceRange R, ASTContext &Ctx\n";
-    
+
     for (ai = Args.begin(); ai != ae; ++ai) {
       OS << "              , ";
       (*ai)->writeCtorParameters(OS);
       OS << "\n";
     }
-    
+
+    OS << "              , ";
+    OS << "unsigned SK = 0";
+    OS << "\n";
+
     OS << "             )\n";
-    OS << "    : " << SuperName << "(attr::" << R.getName() << ", R)\n";
+    OS << "    : " << SuperName << "(attr::" << R.getName() << ", R, SK)\n";
 
     for (ai = Args.begin(); ai != ae; ++ai) {
       OS << "              , ";
@@ -794,7 +798,7 @@
     }
 
     OS << "  {\n";
-  
+
     for (ai = Args.begin(); ai != ae; ++ai) {
       (*ai)->writeCtorBody(OS);
       OS << "\n";
@@ -836,10 +840,10 @@
 
   for (; i != e; ++i) {
     Record &R = **i;
-    
+
     if (!R.getValueAsBit("ASTNode"))
       continue;
-    
+
     std::vector<Record*> ArgRecords = R.getValueAsListOfDefs("Args");
     std::vector<Record*> Spellings = R.getValueAsListOfDefs("Spellings");
     std::vector<Argument*> Args;
@@ -861,8 +865,11 @@
     OS << "void " << R.getName() << "Attr::printPretty("
        << "llvm::raw_ostream &OS, const PrintingPolicy &Policy) const {\n";
     if (Spellings.begin() != Spellings.end()) {
+      OS << "  llvm::SmallString<32> Prefix;\n"
+        << "  llvm::SmallString<8> Suffix;\n"
+        << "  getPrettyPrintString(Prefix, Suffix);\n";
       std::string Spelling = (*Spellings.begin())->getValueAsString("Name");
-      OS << "  OS << \" __attribute__((" << Spelling;
+      OS << "  OS << \" \" + Prefix.str() + \"" << Spelling;
       if (Args.size()) OS << "(";
       if (Spelling == "availability") {
         writeAvailabilityValue(OS);
@@ -873,7 +880,7 @@
         }
       }
       if (Args.size()) OS << ")";
-      OS << "))\";\n";
+      OS << "\" + Suffix.str();\n";
     }
     OS << "}\n\n";
   }
Index: include/clang/AST/Attr.h
===================================================================
--- include/clang/AST/Attr.h	(revision 172270)
+++ include/clang/AST/Attr.h	(working copy)
@@ -21,6 +21,7 @@
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/VersionTuple.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -44,10 +45,21 @@
   unsigned AttrKind : 16;
 
 protected:
+  /// \brief Attribute syntax kind. This should
+  /// match the Syntax defined in Sema AttributeList.
+  enum SyntaxKind {
+    SK_GNU,
+    SK_CXX11,
+    SK_DeclSpec,
+    SK_MSTypeSpec
+  };
+
+  unsigned SyntaxKind : 4;
+
   bool Inherited : 1;
 
   virtual ~Attr();
-  
+
   void* operator new(size_t bytes) throw() {
     llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
   }
@@ -67,9 +79,37 @@
   }
 
 protected:
-  Attr(attr::Kind AK, SourceRange R)
-    : Range(R), AttrKind(AK), Inherited(false) {}
+  Attr(attr::Kind AK, SourceRange R, unsigned SK = SK_GNU)
+    : Range(R), AttrKind(AK), SyntaxKind(SK), Inherited(false) {}
 
+  void getPrettyPrintString(SmallString<32> &Prefix,
+                            SmallString<8> &Suffix) const {
+    switch (SyntaxKind) {
+      case SK_GNU : {
+        Prefix = "__attribute__((";
+        Suffix = "))";
+        break;
+      }
+      case SK_CXX11 : {
+        Prefix = "[[";
+        Suffix = "]]";
+        break;
+      }
+      case SK_DeclSpec : {
+        Prefix = "__declspec(";
+        Suffix = ")";
+        break;
+      }
+      case SK_MSTypeSpec : {
+        Prefix = "";
+        Suffix = "";
+        break;
+      }
+      default:
+        llvm_unreachable("Unknown attribute syntax!");
+    }
+  }
+
 public:
 
   attr::Kind getKind() const {
@@ -95,8 +135,8 @@
 class InheritableAttr : public Attr {
   virtual void anchor();
 protected:
-  InheritableAttr(attr::Kind AK, SourceRange R)
-    : Attr(AK, R) {}
+  InheritableAttr(attr::Kind AK, SourceRange R, unsigned SK = SK_GNU)
+    : Attr(AK, R, SK) {}
 
 public:
   void setInherited(bool I) { Inherited = I; }
@@ -110,8 +150,8 @@
 class InheritableParamAttr : public InheritableAttr {
   virtual void anchor();
 protected:
-  InheritableParamAttr(attr::Kind AK, SourceRange R)
-    : InheritableAttr(AK, R) {}
+  InheritableParamAttr(attr::Kind AK, SourceRange R, unsigned SK = SK_GNU)
+    : InheritableAttr(AK, R, SK) {}
 
 public:
   // Implement isa/cast/dyncast/etc.
