[PATCH] D11492: DarwinAsmParser: Warn on multiple/mismatching version_min directives

Matthias Braun matze at braunis.de
Fri Jul 24 12:58:20 PDT 2015


MatzeB created this revision.
MatzeB added reviewers: rafael, grosbach, steven_wu.
MatzeB added a subscriber: llvm-commits.
MatzeB set the repository for this revision to rL LLVM.

  - Add proxy function for MCAsmParser::Note() to MCAsmParserExtension

  - Warn on multiple version_min directives

  - Warn if .xxx_min_version does not match target triple






Repository:
  rL LLVM

http://reviews.llvm.org/D11492

Files:
  include/llvm/MC/MCParser/MCAsmParserExtension.h
  lib/MC/MCParser/DarwinAsmParser.cpp
  test/MC/MachO/ARM/version-min-diagnostics2.s

Index: test/MC/MachO/ARM/version-min-diagnostics2.s
===================================================================
--- /dev/null
+++ test/MC/MachO/ARM/version-min-diagnostics2.s
@@ -0,0 +1,11 @@
+// RUN: llvm-mc -triple thumbv7-apple-ios %s 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=IOS
+// RUN: llvm-mc -triple i386-apple-macosx %s 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=MACOSX
+
+.ios_version_min 1,2,3
+// MACOSX: version-min-diagnostics2.s:[[@LINE-1]]:1: warning: .ios_version_min should only be used for ios targets
+// IOS-NOT: warning: .ios_version_min should only be used for ios targets
+.macosx_version_min 4,5,6
+// IOS: version-min-diagnostics2.s:[[@LINE-1]]:1: warning: .macosx_version_min should only be used for macosx targets
+// MACOSX-NOT: warning: .macosx_version_min should only be used for macosx targets
+// CHECK: version-min-diagnostics2.s:[[@LINE-3]]:1: warning: overriding previous version_min directive
+// CHECK: version-min-diagnostics2.s:[[@LINE-7]]:1: note: previous definition is here
Index: lib/MC/MCParser/DarwinAsmParser.cpp
===================================================================
--- lib/MC/MCParser/DarwinAsmParser.cpp
+++ lib/MC/MCParser/DarwinAsmParser.cpp
@@ -12,6 +12,7 @@
 #include "llvm/ADT/StringSwitch.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCObjectFileInfo.h"
 #include "llvm/MC/MCParser/MCAsmLexer.h"
 #include "llvm/MC/MCParser/MCAsmParser.h"
 #include "llvm/MC/MCSectionMachO.h"
@@ -38,6 +39,8 @@
                           unsigned TAA = 0, unsigned ImplicitAlign = 0,
                           unsigned StubSize = 0);
 
+  SMLoc LastVersionMinDirective;
+
 public:
   DarwinAsmParser() {}
 
@@ -167,6 +170,8 @@
     addDirectiveHandler<&DarwinAsmParser::parseVersionMin>(".ios_version_min");
     addDirectiveHandler<&DarwinAsmParser::parseVersionMin>(
       ".macosx_version_min");
+
+    LastVersionMinDirective = SMLoc();
   }
 
   bool parseDirectiveDesc(StringRef, SMLoc);
@@ -867,7 +872,7 @@
 /// parseVersionMin
 ///  ::= .ios_version_min major,minor[,update]
 ///  ::= .macosx_version_min major,minor[,update]
-bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc) {
+bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc) {
   int64_t Major = 0, Minor = 0, Update = 0;
   int Kind = StringSwitch<int>(Directive)
     .Case(".ios_version_min", MCVM_IOSVersionMin)
@@ -902,6 +907,22 @@
     Lex();
   }
 
+  const Triple &T = getContext().getObjectFileInfo()->getTargetTriple();
+  Triple::OSType ExpectedOS = Triple::UnknownOS;
+  switch ((MCVersionMinType)Kind) {
+  case MCVM_IOSVersionMin: ExpectedOS = Triple::IOS;    break;
+  case MCVM_OSXVersionMin: ExpectedOS = Triple::MacOSX; break;
+  }
+  if (T.getOS() != ExpectedOS)
+    Warning(Loc, Directive + " should only be used for " +
+            Triple::getOSTypeName(ExpectedOS) + " targets");
+
+  if (LastVersionMinDirective.isValid()) {
+    Warning(Loc, "overriding previous version_min directive");
+    Note(LastVersionMinDirective, "previous definition is here");
+  }
+  LastVersionMinDirective = Loc;
+
   // We've parsed a correct version specifier, so send it to the streamer.
   getStreamer().EmitVersionMin((MCVersionMinType)Kind, Major, Minor, Update);
 
Index: include/llvm/MC/MCParser/MCAsmParserExtension.h
===================================================================
--- include/llvm/MC/MCParser/MCAsmParserExtension.h
+++ include/llvm/MC/MCParser/MCAsmParserExtension.h
@@ -71,6 +71,9 @@
   bool Error(SMLoc L, const Twine &Msg) {
     return getParser().Error(L, Msg);
   }
+  void Note(SMLoc L, const Twine &Msg) {
+    getParser().Note(L, Msg);
+  }
   bool TokError(const Twine &Msg) {
     return getParser().TokError(Msg);
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11492.30594.patch
Type: text/x-patch
Size: 3798 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150724/b0826543/attachment.bin>


More information about the llvm-commits mailing list