diff options
author | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2009-08-20 17:48:52 +0000 |
---|---|---|
committer | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2009-08-20 17:48:52 +0000 |
commit | da3e03ec5d7161135bd90c0786421e8994bcc2f8 (patch) | |
tree | 6e10e08bc0fd9ad5374fb030b15ecf3c5cf3a7eb | |
parent | 09105f52b1f28cbb1374c27c3c70f5517e2c465d (diff) |
Issue an error if the user specifies parameters in a function marked as ISR.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79544 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
-rw-r--r-- | lib/Basic/Targets.cpp | 9 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 16 |
3 files changed, 26 insertions, 3 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index b5f0352677..2fe3d7dcce 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 69b930b55a..49c3ea8c4c 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -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 {} diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index f2a0ed7e04..060b4f436a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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); |