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); } 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(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: 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