@@ -309,7 +309,62 @@ bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
309309 // P32 ABI is only supported on NanoMIPS
310310 if (getTriple ().isNanoMips () != (ABI == " p32" )) {
311311 Diags.Report (diag::err_target_unsupported_abi_for_triple)
312- << ABI << getTriple ().str ();
312+ << ABI << getTriple ().str ();
313+ return false ;
314+ }
315+
316+ // Validate NanoMips target features.
317+ if (getTriple ().isNanoMips ()) {
318+ // NanoMips supports LE only.
319+ if (BigEndian) {
320+ Diags.Report (diag::err_opt_not_valid_on_target) << " -BE" << CPU;
321+ return false ;
322+ }
323+
324+ // NanoMips supports soft float only.
325+ if (FloatABI == HardFloat) {
326+ Diags.Report (diag::err_target_unsupported_abi_for_triple)
327+ << " hard-float" << getTriple ().str ();
328+ return false ;
329+ }
330+
331+ // NanoMips supports p32 ABI only.
332+ if (ABI != " p32" ) {
333+ Diags.Report (diag::err_target_unsupported_abi_for_triple)
334+ << ABI << getTriple ().str ();
335+ return false ;
336+ }
337+
338+ // NanoMips does not support dsp.
339+ if (DspRev != NoDSP) {
340+ Diags.Report (diag::err_opt_not_valid_on_target) << " -mdsp/-mdspr2" << CPU;
341+ return false ;
342+ }
343+
344+ // NanoMips does not support MSA.
345+ if (HasMSA) {
346+ Diags.Report (diag::err_opt_not_valid_on_target) << " -mmsa" << CPU;
347+ return false ;
348+ }
349+
350+ // NanoMips does not support mips16.
351+ if (IsMips16) {
352+ Diags.Report (diag::err_opt_not_valid_on_target) << " -mips16" << CPU;
353+ return false ;
354+ }
355+
356+ // NanoMips does not support micromips.
357+ if (IsMicromips) {
358+ Diags.Report (diag::err_target_unsupported_cpu_for_micromips) << CPU;
359+ return false ;
360+ }
361+
362+ // NanoMips does not support indirect jump hazards.
363+ if (UseIndirectJumpHazard) {
364+ Diags.Report (diag::err_feature_not_valid_on_target)
365+ << " use-indirect-jump-hazard" << CPU;
366+ return false ;
367+ }
313368 }
314369
315370 return true ;
0 commit comments