forked from OSchip/llvm-project
				
			Move logic for passing down -mrelax-all / -relax-all into a common
function. Extend the logic to check if the input was compiled. Use -relax-all as default only if -O0 is used for compilation. Fixes bug 9290. llvm-svn: 130983
This commit is contained in:
		
							parent
							
								
									47061ee5bc
								
							
						
					
					
						commit
						ef317a27ff
					
				| 
						 | 
					@ -924,6 +924,41 @@ static bool ShouldDisableCFI(const ArgList &Args,
 | 
				
			||||||
  return !UseCFI;
 | 
					  return !UseCFI;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// \brief Check whether the given input tree contains any compilation actions.
 | 
				
			||||||
 | 
					static bool ContainsCompileAction(const Action *A) {
 | 
				
			||||||
 | 
					  if (isa<CompileJobAction>(A))
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (Action::const_iterator it = A->begin(), ie = A->end(); it != ie; ++it)
 | 
				
			||||||
 | 
					    if (ContainsCompileAction(*it))
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// \brief Check if -relax-all should be passed to the internal assembler.
 | 
				
			||||||
 | 
					/// This is done by default when compiling non-assembler source with -O0.
 | 
				
			||||||
 | 
					static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
 | 
				
			||||||
 | 
					  bool RelaxDefault = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
 | 
				
			||||||
 | 
					    RelaxDefault = A->getOption().matches(options::OPT_O0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (RelaxDefault) {
 | 
				
			||||||
 | 
					    RelaxDefault = false;
 | 
				
			||||||
 | 
					    for (ActionList::const_iterator it = C.getActions().begin(),
 | 
				
			||||||
 | 
					           ie = C.getActions().end(); it != ie; ++it) {
 | 
				
			||||||
 | 
					      if (ContainsCompileAction(*it)) {
 | 
				
			||||||
 | 
					        RelaxDefault = true;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
 | 
				
			||||||
 | 
					    RelaxDefault);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
 | 
					void Clang::ConstructJob(Compilation &C, const JobAction &JA,
 | 
				
			||||||
                         const InputInfo &Output,
 | 
					                         const InputInfo &Output,
 | 
				
			||||||
                         const InputInfoList &Inputs,
 | 
					                         const InputInfoList &Inputs,
 | 
				
			||||||
| 
						 | 
					@ -959,13 +994,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
 | 
				
			||||||
  } else if (isa<AssembleJobAction>(JA)) {
 | 
					  } else if (isa<AssembleJobAction>(JA)) {
 | 
				
			||||||
    CmdArgs.push_back("-emit-obj");
 | 
					    CmdArgs.push_back("-emit-obj");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // At -O0, we use -mrelax-all by default.
 | 
					    if (UseRelaxAll(C, Args))
 | 
				
			||||||
    bool IsOpt = false;
 | 
					 | 
				
			||||||
    if (Arg *A = Args.getLastArg(options::OPT_O_Group))
 | 
					 | 
				
			||||||
      IsOpt = !A->getOption().matches(options::OPT_O0);
 | 
					 | 
				
			||||||
    if (Args.hasFlag(options::OPT_mrelax_all,
 | 
					 | 
				
			||||||
                     options::OPT_mno_relax_all,
 | 
					 | 
				
			||||||
                     !IsOpt))
 | 
					 | 
				
			||||||
      CmdArgs.push_back("-mrelax-all");
 | 
					      CmdArgs.push_back("-mrelax-all");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // When using an integrated assembler, translate -Wa, and -Xassembler
 | 
					    // When using an integrated assembler, translate -Wa, and -Xassembler
 | 
				
			||||||
| 
						 | 
					@ -2019,13 +2048,7 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
 | 
				
			||||||
  CmdArgs.push_back("-filetype");
 | 
					  CmdArgs.push_back("-filetype");
 | 
				
			||||||
  CmdArgs.push_back("obj");
 | 
					  CmdArgs.push_back("obj");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // At -O0, we use -mrelax-all by default.
 | 
					  if (UseRelaxAll(C, Args))
 | 
				
			||||||
  bool IsOpt = false;
 | 
					 | 
				
			||||||
  if (Arg *A = Args.getLastArg(options::OPT_O_Group))
 | 
					 | 
				
			||||||
    IsOpt = !A->getOption().matches(options::OPT_O0);
 | 
					 | 
				
			||||||
  if (Args.hasFlag(options::OPT_mrelax_all,
 | 
					 | 
				
			||||||
                    options::OPT_mno_relax_all,
 | 
					 | 
				
			||||||
                    !IsOpt))
 | 
					 | 
				
			||||||
    CmdArgs.push_back("-relax-all");
 | 
					    CmdArgs.push_back("-relax-all");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Ignore explicit -force_cpusubtype_ALL option.
 | 
					  // Ignore explicit -force_cpusubtype_ALL option.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue