[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