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