summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSanjiv Gupta <sanjiv.gupta@microchip.com>2009-08-20 17:48:52 +0000
committerSanjiv Gupta <sanjiv.gupta@microchip.com>2009-08-20 17:48:52 +0000
commitda3e03ec5d7161135bd90c0786421e8994bcc2f8 (patch)
tree6e10e08bc0fd9ad5374fb030b15ecf3c5cf3a7eb
parent09105f52b1f28cbb1374c27c3c70f5517e2c465d (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.td4
-rw-r--r--lib/Basic/Targets.cpp9
-rw-r--r--lib/Sema/SemaDecl.cpp16
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);