Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===-- llvm/Target/TargetMachine.h - Target Information --------*- C++ -*-===// | 
| 2 | // | ||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | ||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| 6 | // | ||
| 7 | //===----------------------------------------------------------------------===// | ||
| 8 | // | ||
| 9 | // This file defines the TargetMachine and LLVMTargetMachine classes. | ||
| 10 | // | ||
| 11 | //===----------------------------------------------------------------------===// | ||
| 12 | |||
| 13 | #ifndef LLVM_TARGET_TARGETMACHINE_H | ||
| 14 | #define LLVM_TARGET_TARGETMACHINE_H | ||
| 15 | |||
| 16 | #include "llvm/ADT/StringRef.h" | ||
| 17 | #include "llvm/ADT/Triple.h" | ||
| 18 | #include "llvm/IR/DataLayout.h" | ||
| 19 | #include "llvm/IR/PassManager.h" | ||
| 20 | #include "llvm/Support/Allocator.h" | ||
| 21 | #include "llvm/Support/CodeGen.h" | ||
| 22 | #include "llvm/Support/Error.h" | ||
| 23 | #include "llvm/Support/PGOOptions.h" | ||
| 24 | #include "llvm/Target/CGPassBuilderOption.h" | ||
| 25 | #include "llvm/Target/TargetOptions.h" | ||
| 26 | #include <optional> | ||
| 27 | #include <string> | ||
| 28 | #include <utility> | ||
| 29 | |||
| 30 | namespace llvm { | ||
| 31 | |||
| 32 | class AAManager; | ||
| 33 | using ModulePassManager = PassManager<Module>; | ||
| 34 | |||
| 35 | class Function; | ||
| 36 | class GlobalValue; | ||
| 37 | class MachineFunctionPassManager; | ||
| 38 | class MachineFunctionAnalysisManager; | ||
| 39 | class MachineModuleInfoWrapperPass; | ||
| 40 | class Mangler; | ||
| 41 | class MCAsmInfo; | ||
| 42 | class MCContext; | ||
| 43 | class MCInstrInfo; | ||
| 44 | class MCRegisterInfo; | ||
| 45 | class MCStreamer; | ||
| 46 | class MCSubtargetInfo; | ||
| 47 | class MCSymbol; | ||
| 48 | class raw_pwrite_stream; | ||
| 49 | class PassBuilder; | ||
| 50 | struct PerFunctionMIParsingState; | ||
| 51 | class SMDiagnostic; | ||
| 52 | class SMRange; | ||
| 53 | class Target; | ||
| 54 | class TargetIntrinsicInfo; | ||
| 55 | class TargetIRAnalysis; | ||
| 56 | class TargetTransformInfo; | ||
| 57 | class TargetLoweringObjectFile; | ||
| 58 | class TargetPassConfig; | ||
| 59 | class TargetSubtargetInfo; | ||
| 60 | |||
| 61 | // The old pass manager infrastructure is hidden in a legacy namespace now. | ||
| 62 | namespace legacy { | ||
| 63 | class PassManagerBase; | ||
| 64 | } | ||
| 65 | using legacy::PassManagerBase; | ||
| 66 | |||
| 67 | struct MachineFunctionInfo; | ||
| 68 | namespace yaml { | ||
| 69 | struct MachineFunctionInfo; | ||
| 70 | } | ||
| 71 | |||
| 72 | //===----------------------------------------------------------------------===// | ||
| 73 | /// | ||
| 74 | /// Primary interface to the complete machine description for the target | ||
| 75 | /// machine.  All target-specific information should be accessible through this | ||
| 76 | /// interface. | ||
| 77 | /// | ||
| 78 | class TargetMachine { | ||
| 79 | protected: // Can only create subclasses. | ||
| 80 | TargetMachine(const Target &T, StringRef DataLayoutString, | ||
| 81 | const Triple &TargetTriple, StringRef CPU, StringRef FS, | ||
| 82 | const TargetOptions &Options); | ||
| 83 | |||
| 84 |   /// The Target that this machine was created for. | ||
| 85 | const Target &TheTarget; | ||
| 86 | |||
| 87 |   /// DataLayout for the target: keep ABI type size and alignment. | ||
| 88 |   /// | ||
| 89 |   /// The DataLayout is created based on the string representation provided | ||
| 90 |   /// during construction. It is kept here only to avoid reparsing the string | ||
| 91 |   /// but should not really be used during compilation, because it has an | ||
| 92 |   /// internal cache that is context specific. | ||
| 93 | const DataLayout DL; | ||
| 94 | |||
| 95 |   /// Triple string, CPU name, and target feature strings the TargetMachine | ||
| 96 |   /// instance is created with. | ||
| 97 |   Triple TargetTriple; | ||
| 98 | std::string TargetCPU; | ||
| 99 | std::string TargetFS; | ||
| 100 | |||
| 101 | Reloc::Model RM = Reloc::Static; | ||
| 102 | CodeModel::Model CMModel = CodeModel::Small; | ||
| 103 | CodeGenOpt::Level OptLevel = CodeGenOpt::Default; | ||
| 104 | |||
| 105 |   /// Contains target specific asm information. | ||
| 106 | std::unique_ptr<const MCAsmInfo> AsmInfo; | ||
| 107 | std::unique_ptr<const MCRegisterInfo> MRI; | ||
| 108 | std::unique_ptr<const MCInstrInfo> MII; | ||
| 109 | std::unique_ptr<const MCSubtargetInfo> STI; | ||
| 110 | |||
| 111 | unsigned RequireStructuredCFG : 1; | ||
| 112 | unsigned O0WantsFastISel : 1; | ||
| 113 | |||
| 114 |   // PGO related tunables. | ||
| 115 | std::optional<PGOOptions> PGOOption; | ||
| 116 | |||
| 117 | public: | ||
| 118 | const TargetOptions DefaultOptions; | ||
| 119 | mutable TargetOptions Options; | ||
| 120 | |||
| 121 | TargetMachine(const TargetMachine &) = delete; | ||
| 122 | void operator=(const TargetMachine &) = delete; | ||
| 123 | virtual ~TargetMachine(); | ||
| 124 | |||
| 125 | const Target &getTarget() const { return TheTarget; } | ||
| 126 | |||
| 127 | const Triple &getTargetTriple() const { return TargetTriple; } | ||
| 128 | StringRef getTargetCPU() const { return TargetCPU; } | ||
| 129 | StringRef getTargetFeatureString() const { return TargetFS; } | ||
| 130 | void setTargetFeatureString(StringRef FS) { TargetFS = std::string(FS); } | ||
| 131 | |||
| 132 |   /// Virtual method implemented by subclasses that returns a reference to that | ||
| 133 |   /// target's TargetSubtargetInfo-derived member variable. | ||
| 134 | virtual const TargetSubtargetInfo *getSubtargetImpl(const Function &) const { | ||
| 135 | return nullptr; | ||
| 136 |   } | ||
| 137 | virtual TargetLoweringObjectFile *getObjFileLowering() const { | ||
| 138 | return nullptr; | ||
| 139 |   } | ||
| 140 | |||
| 141 |   /// Create the target's instance of MachineFunctionInfo | ||
| 142 | virtual MachineFunctionInfo * | ||
| 143 | createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, | ||
| 144 | const TargetSubtargetInfo *STI) const { | ||
| 145 | return nullptr; | ||
| 146 |   } | ||
| 147 | |||
| 148 |   /// Allocate and return a default initialized instance of the YAML | ||
| 149 |   /// representation for the MachineFunctionInfo. | ||
| 150 | virtual yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const { | ||
| 151 | return nullptr; | ||
| 152 |   } | ||
| 153 | |||
| 154 |   /// Allocate and initialize an instance of the YAML representation of the | ||
| 155 |   /// MachineFunctionInfo. | ||
| 156 | virtual yaml::MachineFunctionInfo * | ||
| 157 | convertFuncInfoToYAML(const MachineFunction &MF) const { | ||
| 158 | return nullptr; | ||
| 159 |   } | ||
| 160 | |||
| 161 |   /// Parse out the target's MachineFunctionInfo from the YAML reprsentation. | ||
| 162 | virtual bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, | ||
| 163 |                                         PerFunctionMIParsingState &PFS, | ||
| 164 |                                         SMDiagnostic &Error, | ||
| 165 | SMRange &SourceRange) const { | ||
| 166 | return false; | ||
| 167 |   } | ||
| 168 | |||
| 169 |   /// This method returns a pointer to the specified type of | ||
| 170 |   /// TargetSubtargetInfo.  In debug builds, it verifies that the object being | ||
| 171 |   /// returned is of the correct type. | ||
| 172 | template <typename STC> const STC &getSubtarget(const Function &F) const { | ||
| 173 | return *static_cast<const STC*>(getSubtargetImpl(F)); | ||
| 174 |   } | ||
| 175 | |||
| 176 |   /// Create a DataLayout. | ||
| 177 | const DataLayout createDataLayout() const { return DL; } | ||
| 178 | |||
| 179 |   /// Test if a DataLayout if compatible with the CodeGen for this target. | ||
| 180 |   /// | ||
| 181 |   /// The LLVM Module owns a DataLayout that is used for the target independent | ||
| 182 |   /// optimizations and code generation. This hook provides a target specific | ||
| 183 |   /// check on the validity of this DataLayout. | ||
| 184 | bool isCompatibleDataLayout(const DataLayout &Candidate) const { | ||
| 185 | return DL == Candidate; | ||
| 186 |   } | ||
| 187 | |||
| 188 |   /// Get the pointer size for this target. | ||
| 189 |   /// | ||
| 190 |   /// This is the only time the DataLayout in the TargetMachine is used. | ||
| 191 | unsigned getPointerSize(unsigned AS) const { | ||
| 192 | return DL.getPointerSize(AS); | ||
| 193 |   } | ||
| 194 | |||
| 195 | unsigned getPointerSizeInBits(unsigned AS) const { | ||
| 196 | return DL.getPointerSizeInBits(AS); | ||
| 197 |   } | ||
| 198 | |||
| 199 | unsigned getProgramPointerSize() const { | ||
| 200 | return DL.getPointerSize(DL.getProgramAddressSpace()); | ||
| 201 |   } | ||
| 202 | |||
| 203 | unsigned getAllocaPointerSize() const { | ||
| 204 | return DL.getPointerSize(DL.getAllocaAddrSpace()); | ||
| 205 |   } | ||
| 206 | |||
| 207 |   /// Reset the target options based on the function's attributes. | ||
| 208 |   // FIXME: Remove TargetOptions that affect per-function code generation | ||
| 209 |   // from TargetMachine. | ||
| 210 | void resetTargetOptions(const Function &F) const; | ||
| 211 | |||
| 212 |   /// Return target specific asm information. | ||
| 213 | const MCAsmInfo *getMCAsmInfo() const { return AsmInfo.get(); } | ||
| 214 | |||
| 215 | const MCRegisterInfo *getMCRegisterInfo() const { return MRI.get(); } | ||
| 216 | const MCInstrInfo *getMCInstrInfo() const { return MII.get(); } | ||
| 217 | const MCSubtargetInfo *getMCSubtargetInfo() const { return STI.get(); } | ||
| 218 | |||
| 219 |   /// If intrinsic information is available, return it.  If not, return null. | ||
| 220 | virtual const TargetIntrinsicInfo *getIntrinsicInfo() const { | ||
| 221 | return nullptr; | ||
| 222 |   } | ||
| 223 | |||
| 224 | bool requiresStructuredCFG() const { return RequireStructuredCFG; } | ||
| 225 | void setRequiresStructuredCFG(bool Value) { RequireStructuredCFG = Value; } | ||
| 226 | |||
| 227 |   /// Returns the code generation relocation model. The choices are static, PIC, | ||
| 228 |   /// and dynamic-no-pic, and target default. | ||
| 229 | Reloc::Model getRelocationModel() const; | ||
| 230 | |||
| 231 |   /// Returns the code model. The choices are small, kernel, medium, large, and | ||
| 232 |   /// target default. | ||
| 233 | CodeModel::Model getCodeModel() const { return CMModel; } | ||
| 234 | |||
| 235 |   /// Set the code model. | ||
| 236 | void setCodeModel(CodeModel::Model CM) { CMModel = CM; } | ||
| 237 | |||
| 238 | bool isPositionIndependent() const; | ||
| 239 | |||
| 240 | bool shouldAssumeDSOLocal(const Module &M, const GlobalValue *GV) const; | ||
| 241 | |||
| 242 |   /// Returns true if this target uses emulated TLS. | ||
| 243 | bool useEmulatedTLS() const; | ||
| 244 | |||
| 245 |   /// Returns the TLS model which should be used for the given global variable. | ||
| 246 | TLSModel::Model getTLSModel(const GlobalValue *GV) const; | ||
| 247 | |||
| 248 |   /// Returns the optimization level: None, Less, Default, or Aggressive. | ||
| 249 | CodeGenOpt::Level getOptLevel() const; | ||
| 250 | |||
| 251 |   /// Overrides the optimization level. | ||
| 252 | void setOptLevel(CodeGenOpt::Level Level); | ||
| 253 | |||
| 254 | void setFastISel(bool Enable) { Options.EnableFastISel = Enable; } | ||
| 255 | bool getO0WantsFastISel() { return O0WantsFastISel; } | ||
| 256 | void setO0WantsFastISel(bool Enable) { O0WantsFastISel = Enable; } | ||
| 257 | void setGlobalISel(bool Enable) { Options.EnableGlobalISel = Enable; } | ||
| 258 | void setGlobalISelAbort(GlobalISelAbortMode Mode) { | ||
| 259 | Options.GlobalISelAbort = Mode; | ||
| 260 |   } | ||
| 261 | void setMachineOutliner(bool Enable) { | ||
| 262 | Options.EnableMachineOutliner = Enable; | ||
| 263 |   } | ||
| 264 | void setSupportsDefaultOutlining(bool Enable) { | ||
| 265 | Options.SupportsDefaultOutlining = Enable; | ||
| 266 |   } | ||
| 267 | void setSupportsDebugEntryValues(bool Enable) { | ||
| 268 | Options.SupportsDebugEntryValues = Enable; | ||
| 269 |   } | ||
| 270 | |||
| 271 | void setCFIFixup(bool Enable) { Options.EnableCFIFixup = Enable; } | ||
| 272 | |||
| 273 | bool getAIXExtendedAltivecABI() const { | ||
| 274 | return Options.EnableAIXExtendedAltivecABI; | ||
| 275 |   } | ||
| 276 | |||
| 277 | bool getUniqueSectionNames() const { return Options.UniqueSectionNames; } | ||
| 278 | |||
| 279 |   /// Return true if unique basic block section names must be generated. | ||
| 280 | bool getUniqueBasicBlockSectionNames() const { | ||
| 281 | return Options.UniqueBasicBlockSectionNames; | ||
| 282 |   } | ||
| 283 | |||
| 284 |   /// Return true if data objects should be emitted into their own section, | ||
| 285 |   /// corresponds to -fdata-sections. | ||
| 286 | bool getDataSections() const { | ||
| 287 | return Options.DataSections; | ||
| 288 |   } | ||
| 289 | |||
| 290 |   /// Return true if functions should be emitted into their own section, | ||
| 291 |   /// corresponding to -ffunction-sections. | ||
| 292 | bool getFunctionSections() const { | ||
| 293 | return Options.FunctionSections; | ||
| 294 |   } | ||
| 295 | |||
| 296 |   /// Return true if visibility attribute should not be emitted in XCOFF, | ||
| 297 |   /// corresponding to -mignore-xcoff-visibility. | ||
| 298 | bool getIgnoreXCOFFVisibility() const { | ||
| 299 | return Options.IgnoreXCOFFVisibility; | ||
| 300 |   } | ||
| 301 | |||
| 302 |   /// Return true if XCOFF traceback table should be emitted, | ||
| 303 |   /// corresponding to -xcoff-traceback-table. | ||
| 304 | bool getXCOFFTracebackTable() const { return Options.XCOFFTracebackTable; } | ||
| 305 | |||
| 306 |   /// If basic blocks should be emitted into their own section, | ||
| 307 |   /// corresponding to -fbasic-block-sections. | ||
| 308 | llvm::BasicBlockSection getBBSectionsType() const { | ||
| 309 | return Options.BBSections; | ||
| 310 |   } | ||
| 311 | |||
| 312 |   /// Get the list of functions and basic block ids that need unique sections. | ||
| 313 | const MemoryBuffer *getBBSectionsFuncListBuf() const { | ||
| 314 | return Options.BBSectionsFuncListBuf.get(); | ||
| 315 |   } | ||
| 316 | |||
| 317 |   /// Returns true if a cast between SrcAS and DestAS is a noop. | ||
| 318 | virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const { | ||
| 319 | return false; | ||
| 320 |   } | ||
| 321 | |||
| 322 | void setPGOOption(std::optional<PGOOptions> PGOOpt) { PGOOption = PGOOpt; } | ||
| 323 | const std::optional<PGOOptions> &getPGOOption() const { return PGOOption; } | ||
| 324 | |||
| 325 |   /// If the specified generic pointer could be assumed as a pointer to a | ||
| 326 |   /// specific address space, return that address space. | ||
| 327 |   /// | ||
| 328 |   /// Under offloading programming, the offloading target may be passed with | ||
| 329 |   /// values only prepared on the host side and could assume certain | ||
| 330 |   /// properties. | ||
| 331 | virtual unsigned getAssumedAddrSpace(const Value *V) const { return -1; } | ||
| 332 | |||
| 333 |   /// If the specified predicate checks whether a generic pointer falls within | ||
| 334 |   /// a specified address space, return that generic pointer and the address | ||
| 335 |   /// space being queried. | ||
| 336 |   /// | ||
| 337 |   /// Such predicates could be specified in @llvm.assume intrinsics for the | ||
| 338 |   /// optimizer to assume that the given generic pointer always falls within | ||
| 339 |   /// the address space based on that predicate. | ||
| 340 | virtual std::pair<const Value *, unsigned> | ||
| 341 | getPredicatedAddrSpace(const Value *V) const { | ||
| 342 | return std::make_pair(nullptr, -1); | ||
| 343 |   } | ||
| 344 | |||
| 345 |   /// Get a \c TargetIRAnalysis appropriate for the target. | ||
| 346 |   /// | ||
| 347 |   /// This is used to construct the new pass manager's target IR analysis pass, | ||
| 348 |   /// set up appropriately for this target machine. Even the old pass manager | ||
| 349 |   /// uses this to answer queries about the IR. | ||
| 350 | TargetIRAnalysis getTargetIRAnalysis() const; | ||
| 351 | |||
| 352 |   /// Return a TargetTransformInfo for a given function. | ||
| 353 |   /// | ||
| 354 |   /// The returned TargetTransformInfo is specialized to the subtarget | ||
| 355 |   /// corresponding to \p F. | ||
| 356 | virtual TargetTransformInfo getTargetTransformInfo(const Function &F) const; | ||
| 357 | |||
| 358 |   /// Allow the target to modify the pass pipeline. | ||
| 359 | virtual void registerPassBuilderCallbacks(PassBuilder &) {} | ||
| 360 | |||
| 361 |   /// Allow the target to register alias analyses with the AAManager for use | ||
| 362 |   /// with the new pass manager. Only affects the "default" AAManager. | ||
| 363 | virtual void registerDefaultAliasAnalyses(AAManager &) {} | ||
| 364 | |||
| 365 |   /// Add passes to the specified pass manager to get the specified file | ||
| 366 |   /// emitted.  Typically this will involve several steps of code generation. | ||
| 367 |   /// This method should return true if emission of this file type is not | ||
| 368 |   /// supported, or false on success. | ||
| 369 |   /// \p MMIWP is an optional parameter that, if set to non-nullptr, | ||
| 370 |   /// will be used to set the MachineModuloInfo for this PM. | ||
| 371 | virtual bool | ||
| 372 | addPassesToEmitFile(PassManagerBase &, raw_pwrite_stream &, | ||
| 373 |                       raw_pwrite_stream *, CodeGenFileType, | ||
| 374 | bool /*DisableVerify*/ = true, | ||
| 375 | MachineModuleInfoWrapperPass *MMIWP = nullptr) { | ||
| 376 | return true; | ||
| 377 |   } | ||
| 378 | |||
| 379 |   /// Add passes to the specified pass manager to get machine code emitted with | ||
| 380 |   /// the MCJIT. This method returns true if machine code is not supported. It | ||
| 381 |   /// fills the MCContext Ctx pointer which can be used to build custom | ||
| 382 |   /// MCStreamer. | ||
| 383 |   /// | ||
| 384 | virtual bool addPassesToEmitMC(PassManagerBase &, MCContext *&, | ||
| 385 |                                  raw_pwrite_stream &, | ||
| 386 | bool /*DisableVerify*/ = true) { | ||
| 387 | return true; | ||
| 388 |   } | ||
| 389 | |||
| 390 |   /// True if subtarget inserts the final scheduling pass on its own. | ||
| 391 |   /// | ||
| 392 |   /// Branch relaxation, which must happen after block placement, can | ||
| 393 |   /// on some targets (e.g. SystemZ) expose additional post-RA | ||
| 394 |   /// scheduling opportunities. | ||
| 395 | virtual bool targetSchedulesPostRAScheduling() const { return false; }; | ||
| 396 | |||
| 397 | void getNameWithPrefix(SmallVectorImpl<char> &Name, const GlobalValue *GV, | ||
| 398 | Mangler &Mang, bool MayAlwaysUsePrivate = false) const; | ||
| 399 | MCSymbol *getSymbol(const GlobalValue *GV) const; | ||
| 400 | |||
| 401 |   /// The integer bit size to use for SjLj based exception handling. | ||
| 402 | static constexpr unsigned DefaultSjLjDataSize = 32; | ||
| 403 | virtual unsigned getSjLjDataSize() const { return DefaultSjLjDataSize; } | ||
| 404 | |||
| 405 | static std::pair<int, int> parseBinutilsVersion(StringRef Version); | ||
| 406 | |||
| 407 |   /// getAddressSpaceForPseudoSourceKind - Given the kind of memory | ||
| 408 |   /// (e.g. stack) the target returns the corresponding address space. | ||
| 409 | virtual unsigned getAddressSpaceForPseudoSourceKind(unsigned Kind) const { | ||
| 410 | return 0; | ||
| 411 |   } | ||
| 412 | }; | ||
| 413 | |||
| 414 | /// This class describes a target machine that is implemented with the LLVM | ||
| 415 | /// target-independent code generator. | ||
| 416 | /// | ||
| 417 | class LLVMTargetMachine : public TargetMachine { | ||
| 418 | protected: // Can only create subclasses. | ||
| 419 | LLVMTargetMachine(const Target &T, StringRef DataLayoutString, | ||
| 420 | const Triple &TT, StringRef CPU, StringRef FS, | ||
| 421 | const TargetOptions &Options, Reloc::Model RM, | ||
| 422 | CodeModel::Model CM, CodeGenOpt::Level OL); | ||
| 423 | |||
| 424 | void initAsmInfo(); | ||
| 425 | |||
| 426 | public: | ||
| 427 |   /// Get a TargetTransformInfo implementation for the target. | ||
| 428 |   /// | ||
| 429 |   /// The TTI returned uses the common code generator to answer queries about | ||
| 430 |   /// the IR. | ||
| 431 | TargetTransformInfo getTargetTransformInfo(const Function &F) const override; | ||
| 432 | |||
| 433 |   /// Create a pass configuration object to be used by addPassToEmitX methods | ||
| 434 |   /// for generating a pipeline of CodeGen passes. | ||
| 435 | virtual TargetPassConfig *createPassConfig(PassManagerBase &PM); | ||
| 436 | |||
| 437 |   /// Add passes to the specified pass manager to get the specified file | ||
| 438 |   /// emitted.  Typically this will involve several steps of code generation. | ||
| 439 |   /// \p MMIWP is an optional parameter that, if set to non-nullptr, | ||
| 440 |   /// will be used to set the MachineModuloInfo for this PM. | ||
| 441 |   bool | ||
| 442 | addPassesToEmitFile(PassManagerBase &PM, raw_pwrite_stream &Out, | ||
| 443 |                       raw_pwrite_stream *DwoOut, CodeGenFileType FileType, | ||
| 444 | bool DisableVerify = true, | ||
| 445 | MachineModuleInfoWrapperPass *MMIWP = nullptr) override; | ||
| 446 | |||
| 447 | virtual Error buildCodeGenPipeline(ModulePassManager &, | ||
| 448 |                                      MachineFunctionPassManager &, | ||
| 449 |                                      MachineFunctionAnalysisManager &, | ||
| 450 | raw_pwrite_stream &, raw_pwrite_stream *, | ||
| 451 | CodeGenFileType, CGPassBuilderOption, | ||
| 452 | PassInstrumentationCallbacks *) { | ||
| 453 | return make_error<StringError>("buildCodeGenPipeline is not overridden", | ||
| 454 | inconvertibleErrorCode()); | ||
| 455 |   } | ||
| 456 | |||
| 457 | virtual std::pair<StringRef, bool> getPassNameFromLegacyName(StringRef) { | ||
| 458 |     llvm_unreachable( | ||
| 459 | "getPassNameFromLegacyName parseMIRPipeline is not overridden"); | ||
| 460 |   } | ||
| 461 | |||
| 462 |   /// Add passes to the specified pass manager to get machine code emitted with | ||
| 463 |   /// the MCJIT. This method returns true if machine code is not supported. It | ||
| 464 |   /// fills the MCContext Ctx pointer which can be used to build custom | ||
| 465 |   /// MCStreamer. | ||
| 466 | bool addPassesToEmitMC(PassManagerBase &PM, MCContext *&Ctx, | ||
| 467 |                          raw_pwrite_stream &Out, | ||
| 468 | bool DisableVerify = true) override; | ||
| 469 | |||
| 470 |   /// Returns true if the target is expected to pass all machine verifier | ||
| 471 |   /// checks. This is a stopgap measure to fix targets one by one. We will | ||
| 472 |   /// remove this at some point and always enable the verifier when | ||
| 473 |   /// EXPENSIVE_CHECKS is enabled. | ||
| 474 | virtual bool isMachineVerifierClean() const { return true; } | ||
| 475 | |||
| 476 |   /// Adds an AsmPrinter pass to the pipeline that prints assembly or | ||
| 477 |   /// machine code from the MI representation. | ||
| 478 | bool addAsmPrinter(PassManagerBase &PM, raw_pwrite_stream &Out, | ||
| 479 |                      raw_pwrite_stream *DwoOut, CodeGenFileType FileType, | ||
| 480 | MCContext &Context); | ||
| 481 | |||
| 482 | Expected<std::unique_ptr<MCStreamer>> | ||
| 483 | createMCStreamer(raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, | ||
| 484 | CodeGenFileType FileType, MCContext &Ctx); | ||
| 485 | |||
| 486 |   /// True if the target uses physical regs (as nearly all targets do). False | ||
| 487 |   /// for stack machines such as WebAssembly and other virtual-register | ||
| 488 |   /// machines. If true, all vregs must be allocated before PEI. If false, then | ||
| 489 |   /// callee-save register spilling and scavenging are not needed or used. If | ||
| 490 |   /// false, implicitly defined registers will still be assumed to be physical | ||
| 491 |   /// registers, except that variadic defs will be allocated vregs. | ||
| 492 | virtual bool usesPhysRegsForValues() const { return true; } | ||
| 493 | |||
| 494 |   /// True if the target wants to use interprocedural register allocation by | ||
| 495 |   /// default. The -enable-ipra flag can be used to override this. | ||
| 496 | virtual bool useIPRA() const { | ||
| 497 | return false; | ||
| 498 |   } | ||
| 499 | |||
| 500 |   /// The default variant to use in unqualified `asm` instructions. | ||
| 501 |   /// If this returns 0, `asm "$(foo$|bar$)"` will evaluate to `asm "foo"`. | ||
| 502 | virtual int unqualifiedInlineAsmVariant() const { return 0; } | ||
| 503 | }; | ||
| 504 | |||
| 505 | /// Helper method for getting the code model, returning Default if | ||
| 506 | /// CM does not have a value. The tiny and kernel models will produce | ||
| 507 | /// an error, so targets that support them or require more complex codemodel | ||
| 508 | /// selection logic should implement and call their own getEffectiveCodeModel. | ||
| 509 | inline CodeModel::Model | ||
| 510 | getEffectiveCodeModel(std::optional<CodeModel::Model> CM, | ||
| 511 | CodeModel::Model Default) { | ||
| 512 | if (CM) { | ||
| 513 |     // By default, targets do not support the tiny and kernel models. | ||
| 514 | if (*CM == CodeModel::Tiny) | ||
| 515 | report_fatal_error("Target does not support the tiny CodeModel", false); | ||
| 516 | if (*CM == CodeModel::Kernel) | ||
| 517 | report_fatal_error("Target does not support the kernel CodeModel", false); | ||
| 518 | return *CM; | ||
| 519 |   } | ||
| 520 | return Default; | ||
| 521 | } | ||
| 522 | |||
| 523 | } // end namespace llvm | ||
| 524 | |||
| 525 | #endif // LLVM_TARGET_TARGETMACHINE_H |