Index: test/CodeGen/attr-naked.c
===================================================================
--- test/CodeGen/attr-naked.c	(révision 0)
+++ test/CodeGen/attr-naked.c	(révision 0)
@@ -0,0 +1,9 @@
+// RUN: clang-cc -g -emit-llvm -o %t %s &&
+// RUN: grep 'naked' %t
+
+
+void t1() __attribute__((naked));
+
+void t1()
+{
+}
Index: include/clang/AST/Attr.h
===================================================================
--- include/clang/AST/Attr.h	(révision 81896)
+++ include/clang/AST/Attr.h	(copie de travail)
@@ -63,6 +63,7 @@
     GNUInline,
     IBOutletKind, // Clang-specific.  Use "Kind" suffix to not conflict with
     Malloc,
+    Naked,
     NoDebug,
     NoInline,
     NonNull,
@@ -499,6 +500,7 @@
 DEF_SIMPLE_ATTR(NoDebug);
 DEF_SIMPLE_ATTR(WarnUnusedResult);
 DEF_SIMPLE_ATTR(NoInline);
+DEF_SIMPLE_ATTR(Naked);
 
 class RegparmAttr : public Attr {
   unsigned NumParams;
Index: include/clang/Parse/AttributeList.h
===================================================================
--- include/clang/Parse/AttributeList.h	(révision 81896)
+++ include/clang/Parse/AttributeList.h	(copie de travail)
@@ -71,6 +71,7 @@
     AT_gnu_inline,
     AT_malloc,
     AT_mode,
+    AT_naked,
     AT_nodebug,
     AT_noinline,
     AT_no_instrument_function,
Index: lib/Frontend/PCHWriter.cpp
===================================================================
--- lib/Frontend/PCHWriter.cpp	(révision 81896)
+++ lib/Frontend/PCHWriter.cpp	(copie de travail)
@@ -1680,6 +1680,7 @@
     case Attr::GNUInline:
     case Attr::IBOutletKind:
     case Attr::Malloc:
+    case Attr::Naked:
     case Attr::NoDebug:
     case Attr::NoReturn:
     case Attr::NoThrow:
Index: lib/Frontend/PCHReaderDecl.cpp
===================================================================
--- lib/Frontend/PCHReaderDecl.cpp	(révision 81896)
+++ lib/Frontend/PCHReaderDecl.cpp	(copie de travail)
@@ -547,6 +547,7 @@
       break;
 
     SIMPLE_ATTR(Malloc);
+    SIMPLE_ATTR(Naked);
     SIMPLE_ATTR(NoDebug);
     SIMPLE_ATTR(NoInline);
     SIMPLE_ATTR(NoReturn);
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp	(révision 81896)
+++ lib/CodeGen/CodeGenModule.cpp	(copie de travail)
@@ -340,6 +340,9 @@
 
   if (D->hasAttr<NoInlineAttr>())
     F->addFnAttr(llvm::Attribute::NoInline);
+
+  if (D->hasAttr<NakedAttr>())
+    F->addFnAttr(llvm::Attribute::Naked);
 }
 
 void CodeGenModule::SetCommonAttributes(const Decl *D,
Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp	(révision 81896)
+++ lib/Sema/SemaDeclAttr.cpp	(copie de travail)
@@ -1051,6 +1051,22 @@
   d->addAttr(::new (S.Context) FastCallAttr());
 }
 
+static void HandleNakedAttr(Decl *d, const AttributeList &Attr, Sema &S){
+  // check the attribute arguments.
+  if (Attr.getNumArgs() != 0) {
+    S.Diag(Attr.getLoc(), diag::err_attribute_wrong_number_arguments) << 0;
+    return;
+  }
+
+  if (!isa<FunctionDecl>(d)) {
+    S.Diag(Attr.getLoc(), diag::warn_attribute_wrong_decl_type)
+      << Attr.getName() << 0 /*function*/;
+    return;
+  }
+
+  d->addAttr(::new (S.Context) NakedAttr());
+}
+
 static void HandleNothrowAttr(Decl *d, const AttributeList &Attr, Sema &S) {
   // check the attribute arguments.
   if (Attr.getNumArgs() != 0) {
@@ -1803,7 +1819,8 @@
   case AttributeList::AT_fastcall:    HandleFastCallAttr  (D, Attr, S); break;
   case AttributeList::AT_format:      HandleFormatAttr    (D, Attr, S); break;
   case AttributeList::AT_format_arg:  HandleFormatArgAttr (D, Attr, S); break;
-  case AttributeList::AT_gnu_inline:  HandleGNUInlineAttr(D, Attr, S); break;
+  case AttributeList::AT_gnu_inline:  HandleGNUInlineAttr (D, Attr, S); break;
+  case AttributeList::AT_naked:       HandleNakedAttr     (D, Attr, S); break;
   case AttributeList::AT_mode:        HandleModeAttr      (D, Attr, S); break;
   case AttributeList::AT_malloc:      HandleMallocAttr    (D, Attr, S); break;
   case AttributeList::AT_nonnull:     HandleNonNullAttr   (D, Attr, S); break;
Index: lib/Parse/AttributeList.cpp
===================================================================
--- lib/Parse/AttributeList.cpp	(révision 81896)
+++ lib/Parse/AttributeList.cpp	(copie de travail)
@@ -66,6 +66,7 @@
   case 5:
     if (!memcmp(Str, "alias", 5)) return AT_alias;
     if (!memcmp(Str, "const", 5)) return AT_const;
+    if (!memcmp(Str, "naked", 5)) return AT_naked;
     break;
   case 6:
     if (!memcmp(Str, "packed", 6)) return AT_packed;
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to