Index: lib/Target/Mips/AsmParser/MipsAsmParser.cpp =================================================================== --- lib/Target/Mips/AsmParser/MipsAsmParser.cpp +++ lib/Target/Mips/AsmParser/MipsAsmParser.cpp @@ -3725,43 +3725,44 @@ return false; } - if (Lexer.is(AsmToken::Identifier)) { - StringRef Option = Parser.getTok().getString(); - Parser.Lex(); - - if (Option == "oddspreg") { - getTargetStreamer().emitDirectiveModuleOddSPReg(true, isABI_O32()); - clearFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); + StringRef Option; + if (Parser.parseIdentifier(Option)) { + reportParseError("expected .module option identifier"); + return false; + } - if (getLexer().isNot(AsmToken::EndOfStatement)) { - reportParseError("unexpected token, expected end of statement"); - return false; - } + if (Option == "oddspreg") { + getTargetStreamer().emitDirectiveModuleOddSPReg(true, isABI_O32()); + clearFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); + // If this is not the end of the statement, report an error. + if (getLexer().isNot(AsmToken::EndOfStatement)) { + reportParseError("unexpected token, expected end of statement"); return false; - } else if (Option == "nooddspreg") { - if (!isABI_O32()) { - Error(L, "'.module nooddspreg' requires the O32 ABI"); - return false; - } + } - getTargetStreamer().emitDirectiveModuleOddSPReg(false, isABI_O32()); - setFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); + return false; // parseDirectiveModule has finished successfully. + } else if (Option == "nooddspreg") { + if (!isABI_O32()) { + Error(L, "'.module nooddspreg' requires the O32 ABI"); + return false; + } - if (getLexer().isNot(AsmToken::EndOfStatement)) { - reportParseError("unexpected token, expected end of statement"); - return false; - } + getTargetStreamer().emitDirectiveModuleOddSPReg(false, isABI_O32()); + setFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); + // If this is not the end of the statement, report an error. + if (getLexer().isNot(AsmToken::EndOfStatement)) { + reportParseError("unexpected token, expected end of statement"); return false; - } else if (Option == "fp") { - return parseDirectiveModuleFP(); } + return false; // parseDirectiveModule has finished successfully. + } else if (Option == "fp") { + return parseDirectiveModuleFP(); + } else { return Error(L, "'" + Twine(Option) + "' is not a valid .module option."); } - - return false; } /// parseDirectiveModuleFP Index: test/MC/Mips/mips-abi-bad.s =================================================================== --- test/MC/Mips/mips-abi-bad.s +++ test/MC/Mips/mips-abi-bad.s @@ -1,20 +1,30 @@ -# Error checking for malformed abi related directives # RUN: not llvm-mc -triple mips-unknown-unknown %s 2>&1 | FileCheck %s -# CHECK: .text + +# Error checking for malformed .module directives (and .set fp=...). + .module fp=3 -# CHECK : mips-abi-bad.s:4:16: error: unsupported option -# CHECK-NEXT : .module fp=3 -# CHECK-NEXT : ^ +# CHECK: :[[@LINE-1]]:17: error: unsupported value, expected 'xx', '32' or '64' +# CHECK-NEXT: .module fp=3 +# CHECK-NEXT: ^ +# FIXME: Add separate test for .set fp=xx/32/64. .set fp=xx,6 -# CHECK :mips-abi-bad.s:5:15: error: unexpected token in statement -# CHECK-NEXT : .set fp=xx,6 -# CHECK-NEXT : ^ +# CHECK: :[[@LINE-1]]:15: error: unexpected token, expected end of statement +# CHECK-NEXT: .set fp=xx,6 +# CHECK-NEXT: ^ + + .module +# CHECK: :[[@LINE-1]]:12: error: expected .module option identifier +# CHECK-NEXT: .module +# CHECK-NEXT: ^ + + .module 34 +# CHECK: :[[@LINE-1]]:13: error: expected .module option identifier +# CHECK-NEXT: .module 34 +# CHECK-NEXT: ^ -# CHECK :.set mips16 .set mips16 .module fp=32 - -# CHECK :mips-abi-bad.s:14:13: error: .module directive must come before any code -# CHECK-NEXT : .module fp=32 -# CHECK-NEXT : ^ +# CHECK: :[[@LINE-1]]:13: error: .module directive must appear before any code +# CHECK-NEXT: .module fp=32 +# CHECK-NEXT: ^