1 //===--- BackendUtil.cpp - LLVM Backend Utilities -------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/CodeGen/BackendUtil.h" 11 #include "clang/Basic/Diagnostic.h" 12 #include "clang/Basic/TargetOptions.h" 13 #include "clang/Frontend/CodeGenOptions.h" 14 #include "clang/Frontend/FrontendDiagnostic.h" 15 #include "llvm/Module.h" 16 #include "llvm/PassManager.h" 17 #include "llvm/Assembly/PrintModulePass.h" 18 #include "llvm/Bitcode/ReaderWriter.h" 19 #include "llvm/CodeGen/RegAllocRegistry.h" 20 #include "llvm/CodeGen/SchedulerRegistry.h" 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/FormattedStream.h" 23 #include "llvm/Support/PrettyStackTrace.h" 24 #include "llvm/Support/StandardPasses.h" 25 #include "llvm/Support/Timer.h" 26 #include "llvm/Support/raw_ostream.h" 27 #include "llvm/Target/SubtargetFeature.h" 28 #include "llvm/Target/TargetData.h" 29 #include "llvm/Target/TargetMachine.h" 30 #include "llvm/Target/TargetOptions.h" 31 #include "llvm/Target/TargetRegistry.h" 32 using namespace clang; 33 using namespace llvm; 34 35 namespace { 36 37 class EmitAssemblyHelper { 38 Diagnostic &Diags; 39 const CodeGenOptions &CodeGenOpts; 40 const TargetOptions &TargetOpts; 41 Module *TheModule; 42 43 Timer CodeGenerationTime; 44 45 mutable PassManager *CodeGenPasses; 46 mutable PassManager *PerModulePasses; 47 mutable FunctionPassManager *PerFunctionPasses; 48 49 private: 50 PassManager *getCodeGenPasses() const { 51 if (!CodeGenPasses) { 52 CodeGenPasses = new PassManager(); 53 CodeGenPasses->add(new TargetData(TheModule)); 54 } 55 return CodeGenPasses; 56 } 57 58 PassManager *getPerModulePasses() const { 59 if (!PerModulePasses) { 60 PerModulePasses = new PassManager(); 61 PerModulePasses->add(new TargetData(TheModule)); 62 } 63 return PerModulePasses; 64 } 65 66 FunctionPassManager *getPerFunctionPasses() const { 67 if (!PerFunctionPasses) { 68 PerFunctionPasses = new FunctionPassManager(TheModule); 69 PerFunctionPasses->add(new TargetData(TheModule)); 70 } 71 return PerFunctionPasses; 72 } 73 74 void CreatePasses(); 75 76 /// AddEmitPasses - Add passes necessary to emit assembly or LLVM IR. 77 /// 78 /// \return True on success. 79 bool AddEmitPasses(BackendAction Action, formatted_raw_ostream &OS); 80 81 public: 82 EmitAssemblyHelper(Diagnostic &_Diags, 83 const CodeGenOptions &CGOpts, const TargetOptions &TOpts, 84 Module *M) 85 : Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts), 86 TheModule(M), CodeGenerationTime("Code Generation Time"), 87 CodeGenPasses(0), PerModulePasses(0), PerFunctionPasses(0) {} 88 89 ~EmitAssemblyHelper() { 90 delete CodeGenPasses; 91 delete PerModulePasses; 92 delete PerFunctionPasses; 93 } 94 95 void EmitAssembly(BackendAction Action, raw_ostream *OS); 96 }; 97 98 } 99 100 void EmitAssemblyHelper::CreatePasses() { 101 unsigned OptLevel = CodeGenOpts.OptimizationLevel; 102 CodeGenOptions::InliningMethod Inlining = CodeGenOpts.Inlining; 103 104 // Handle disabling of LLVM optimization, where we want to preserve the 105 // internal module before any optimization. 106 if (CodeGenOpts.DisableLLVMOpts) { 107 OptLevel = 0; 108 Inlining = CodeGenOpts.NoInlining; 109 } 110 111 // In -O0 if checking is disabled, we don't even have per-function passes. 112 if (CodeGenOpts.VerifyModule) 113 getPerFunctionPasses()->add(createVerifierPass()); 114 115 // Assume that standard function passes aren't run for -O0. 116 if (OptLevel > 0) 117 llvm::createStandardFunctionPasses(getPerFunctionPasses(), OptLevel); 118 119 llvm::Pass *InliningPass = 0; 120 switch (Inlining) { 121 case CodeGenOptions::NoInlining: break; 122 case CodeGenOptions::NormalInlining: { 123 // Set the inline threshold following llvm-gcc. 124 // 125 // FIXME: Derive these constants in a principled fashion. 126 unsigned Threshold = 225; 127 if (CodeGenOpts.OptimizeSize) 128 Threshold = 75; 129 else if (OptLevel > 2) 130 Threshold = 275; 131 InliningPass = createFunctionInliningPass(Threshold); 132 break; 133 } 134 case CodeGenOptions::OnlyAlwaysInlining: 135 InliningPass = createAlwaysInlinerPass(); // Respect always_inline 136 break; 137 } 138 139 // For now we always create per module passes. 140 llvm::createStandardModulePasses(getPerModulePasses(), OptLevel, 141 CodeGenOpts.OptimizeSize, 142 CodeGenOpts.UnitAtATime, 143 CodeGenOpts.UnrollLoops, 144 CodeGenOpts.SimplifyLibCalls, 145 /*HaveExceptions=*/true, 146 InliningPass); 147 } 148 149 bool EmitAssemblyHelper::AddEmitPasses(BackendAction Action, 150 formatted_raw_ostream &OS) { 151 // Create the TargetMachine for generating code. 152 std::string Error; 153 std::string Triple = TheModule->getTargetTriple(); 154 const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error); 155 if (!TheTarget) { 156 Diags.Report(diag::err_fe_unable_to_create_target) << Error; 157 return false; 158 } 159 160 // FIXME: Expose these capabilities via actual APIs!!!! Aside from just 161 // being gross, this is also totally broken if we ever care about 162 // concurrency. 163 164 // Set frame pointer elimination mode. 165 if (!CodeGenOpts.DisableFPElim) { 166 llvm::NoFramePointerElim = false; 167 llvm::NoFramePointerElimNonLeaf = false; 168 } else if (CodeGenOpts.OmitLeafFramePointer) { 169 llvm::NoFramePointerElim = false; 170 llvm::NoFramePointerElimNonLeaf = true; 171 } else { 172 llvm::NoFramePointerElim = true; 173 llvm::NoFramePointerElimNonLeaf = true; 174 } 175 176 // Set float ABI type. 177 if (CodeGenOpts.FloatABI == "soft") 178 llvm::FloatABIType = llvm::FloatABI::Soft; 179 else if (CodeGenOpts.FloatABI == "hard") 180 llvm::FloatABIType = llvm::FloatABI::Hard; 181 else { 182 assert(CodeGenOpts.FloatABI.empty() && "Invalid float abi!"); 183 llvm::FloatABIType = llvm::FloatABI::Default; 184 } 185 186 llvm::LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD; 187 llvm::NoInfsFPMath = CodeGenOpts.NoInfsFPMath; 188 llvm::NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath; 189 NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS; 190 llvm::UnsafeFPMath = CodeGenOpts.UnsafeFPMath; 191 llvm::UseSoftFloat = CodeGenOpts.SoftFloat; 192 UnwindTablesMandatory = CodeGenOpts.UnwindTables; 193 194 TargetMachine::setAsmVerbosityDefault(CodeGenOpts.AsmVerbose); 195 196 TargetMachine::setFunctionSections(CodeGenOpts.FunctionSections); 197 TargetMachine::setDataSections (CodeGenOpts.DataSections); 198 199 // FIXME: Parse this earlier. 200 if (CodeGenOpts.RelocationModel == "static") { 201 TargetMachine::setRelocationModel(llvm::Reloc::Static); 202 } else if (CodeGenOpts.RelocationModel == "pic") { 203 TargetMachine::setRelocationModel(llvm::Reloc::PIC_); 204 } else { 205 assert(CodeGenOpts.RelocationModel == "dynamic-no-pic" && 206 "Invalid PIC model!"); 207 TargetMachine::setRelocationModel(llvm::Reloc::DynamicNoPIC); 208 } 209 // FIXME: Parse this earlier. 210 if (CodeGenOpts.CodeModel == "small") { 211 TargetMachine::setCodeModel(llvm::CodeModel::Small); 212 } else if (CodeGenOpts.CodeModel == "kernel") { 213 TargetMachine::setCodeModel(llvm::CodeModel::Kernel); 214 } else if (CodeGenOpts.CodeModel == "medium") { 215 TargetMachine::setCodeModel(llvm::CodeModel::Medium); 216 } else if (CodeGenOpts.CodeModel == "large") { 217 TargetMachine::setCodeModel(llvm::CodeModel::Large); 218 } else { 219 assert(CodeGenOpts.CodeModel.empty() && "Invalid code model!"); 220 TargetMachine::setCodeModel(llvm::CodeModel::Default); 221 } 222 223 std::vector<const char *> BackendArgs; 224 BackendArgs.push_back("clang"); // Fake program name. 225 if (!CodeGenOpts.DebugPass.empty()) { 226 BackendArgs.push_back("-debug-pass"); 227 BackendArgs.push_back(CodeGenOpts.DebugPass.c_str()); 228 } 229 if (!CodeGenOpts.LimitFloatPrecision.empty()) { 230 BackendArgs.push_back("-limit-float-precision"); 231 BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str()); 232 } 233 if (llvm::TimePassesIsEnabled) 234 BackendArgs.push_back("-time-passes"); 235 BackendArgs.push_back(0); 236 llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1, 237 const_cast<char **>(&BackendArgs[0])); 238 239 std::string FeaturesStr; 240 if (TargetOpts.CPU.size() || TargetOpts.Features.size()) { 241 SubtargetFeatures Features; 242 Features.setCPU(TargetOpts.CPU); 243 for (std::vector<std::string>::const_iterator 244 it = TargetOpts.Features.begin(), 245 ie = TargetOpts.Features.end(); it != ie; ++it) 246 Features.AddFeature(*it); 247 FeaturesStr = Features.getString(); 248 } 249 TargetMachine *TM = TheTarget->createTargetMachine(Triple, FeaturesStr); 250 251 if (CodeGenOpts.RelaxAll) 252 TM->setMCRelaxAll(true); 253 254 // Create the code generator passes. 255 PassManager *PM = getCodeGenPasses(); 256 CodeGenOpt::Level OptLevel = CodeGenOpt::Default; 257 258 switch (CodeGenOpts.OptimizationLevel) { 259 default: break; 260 case 0: OptLevel = CodeGenOpt::None; break; 261 case 3: OptLevel = CodeGenOpt::Aggressive; break; 262 } 263 264 // Normal mode, emit a .s or .o file by running the code generator. Note, 265 // this also adds codegenerator level optimization passes. 266 TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile; 267 if (Action == Backend_EmitObj) 268 CGFT = TargetMachine::CGFT_ObjectFile; 269 else if (Action == Backend_EmitMCNull) 270 CGFT = TargetMachine::CGFT_Null; 271 else 272 assert(Action == Backend_EmitAssembly && "Invalid action!"); 273 if (TM->addPassesToEmitFile(*PM, OS, CGFT, OptLevel, 274 /*DisableVerify=*/!CodeGenOpts.VerifyModule)) { 275 Diags.Report(diag::err_fe_unable_to_interface_with_target); 276 return false; 277 } 278 279 return true; 280 } 281 282 void EmitAssemblyHelper::EmitAssembly(BackendAction Action, raw_ostream *OS) { 283 TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime : 0); 284 llvm::formatted_raw_ostream FormattedOS; 285 286 CreatePasses(); 287 switch (Action) { 288 case Backend_EmitNothing: 289 break; 290 291 case Backend_EmitBC: 292 getPerModulePasses()->add(createBitcodeWriterPass(*OS)); 293 break; 294 295 case Backend_EmitLL: 296 FormattedOS.setStream(*OS, formatted_raw_ostream::PRESERVE_STREAM); 297 getPerModulePasses()->add(createPrintModulePass(&FormattedOS)); 298 break; 299 300 default: 301 FormattedOS.setStream(*OS, formatted_raw_ostream::PRESERVE_STREAM); 302 if (!AddEmitPasses(Action, FormattedOS)) 303 return; 304 } 305 306 // Run passes. For now we do all passes at once, but eventually we 307 // would like to have the option of streaming code generation. 308 309 if (PerFunctionPasses) { 310 PrettyStackTraceString CrashInfo("Per-function optimization"); 311 312 PerFunctionPasses->doInitialization(); 313 for (Module::iterator I = TheModule->begin(), 314 E = TheModule->end(); I != E; ++I) 315 if (!I->isDeclaration()) 316 PerFunctionPasses->run(*I); 317 PerFunctionPasses->doFinalization(); 318 } 319 320 if (PerModulePasses) { 321 PrettyStackTraceString CrashInfo("Per-module optimization passes"); 322 PerModulePasses->run(*TheModule); 323 } 324 325 if (CodeGenPasses) { 326 PrettyStackTraceString CrashInfo("Code generation"); 327 CodeGenPasses->run(*TheModule); 328 } 329 } 330 331 void clang::EmitBackendOutput(Diagnostic &Diags, const CodeGenOptions &CGOpts, 332 const TargetOptions &TOpts, Module *M, 333 BackendAction Action, raw_ostream *OS) { 334 EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, M); 335 336 AsmHelper.EmitAssembly(Action, OS); 337 } 338