]> granicus.if.org Git - clang/commitdiff
Issue an error if the user specifies parameters in a function marked as ISR.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Thu, 20 Aug 2009 17:48:52 +0000 (17:48 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Thu, 20 Aug 2009 17:48:52 +0000 (17:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79544 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Basic/Targets.cpp
lib/Sema/SemaDecl.cpp

index b5f03526774816bb9107e3412a375987e9c9d549..2fe3d7dcce4ebfb833dd54671135e2becefbf57a 100644 (file)
@@ -76,7 +76,9 @@ def warn_unused_parameter : Warning<"unused parameter %0">,
   InGroup<UnusedParameter>, DefaultIgnore;
 def warn_decl_in_param_list : Warning<
   "declaration of %0 will not be visible outside of this function">;
-  
+def warn_ISR_has_arguments : Warning<
+  "Interrupt Service Routine (%0) has arguments">;
+
 def warn_implicit_function_decl : Warning<
   "implicit declaration of function %0">,
   InGroup<ImplicitFunctionDeclare>, DefaultIgnore;
index 69b930b55acd8fb282534f47b648431c63fdf337..49c3ea8c4cb44508644be36ecd8b52a23c9aa130 100644 (file)
@@ -1247,9 +1247,14 @@ namespace {
       Define(Defines, "__pic16");
       Define(Defines, "rom", "__attribute__((address_space(1)))");
       Define(Defines, "ram", "__attribute__((address_space(0)))");
-      Define(Defines, "_section(SectName)", "__attribute__((section(SectName)))");
-      Define(Defines, "_address(Addr)","__attribute__((section(\"Address=\"#Addr)))");
+      Define(Defines, "_section(SectName)", 
+             "__attribute__((section(SectName)))");
+      Define(Defines, "_address(Addr)",
+             "__attribute__((section(\"Address=\"#Addr)))");
       Define(Defines, "_CONFIG(conf)", "asm(\"CONFIG \"#conf)");
+      Define(Defines, "_interrupt",
+             "__attribute__((section(\"interrupt=0x4\"))) \
+             __attribute__((used))");
     }
     virtual void getTargetBuiltins(const Builtin::Info *&Records,
                                    unsigned &NumRecords) const {}
index f2a0ed7e04c9f54efd90d7a6d689346bbfcfb4a5..060b4f436a783436038cacb45c4946fa95b05a13 100644 (file)
@@ -1240,6 +1240,22 @@ void Sema::CheckFallThroughForBlock(QualType BlockTy, Stmt *Body) {
 /// parameters are complete.
 bool Sema::CheckParmsForFunctionDef(FunctionDecl *FD) {
   bool HasInvalidParm = false;
+
+  // PIC16 uses section string to encode the info about ISR.
+  // Flash error if ISR has arguments.
+  const char *TargetPrefix = Context.Target.getTargetPrefix();
+  if (strcmp(TargetPrefix, "pic16") == 0) { 
+    unsigned ParamCount = FD->getNumParams();
+    if (const SectionAttr *SA = FD->getAttr<SectionAttr>()) {
+        const std::string &SecString = SA->getName(); 
+        if (SecString.find("interrupt") != std::string::npos 
+            && ParamCount > 0) {
+          Diag(FD->getLocation(), diag::warn_ISR_has_arguments) 
+                          << FD->getNameAsString();
+      }
+    }
+  }
+
   for (unsigned p = 0, NumParams = FD->getNumParams(); p < NumParams; ++p) {
     ParmVarDecl *Param = FD->getParamDecl(p);