diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 45 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/ARMAsmPrinter.h | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp | 6 | 
3 files changed, 49 insertions, 7 deletions
| diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 67ebfa2b581..61141c0031d 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -60,7 +60,7 @@ using namespace llvm;  ARMAsmPrinter::ARMAsmPrinter(TargetMachine &TM,                               std::unique_ptr<MCStreamer> Streamer)      : AsmPrinter(TM, std::move(Streamer)), AFI(nullptr), MCP(nullptr), -      InConstantPool(false) {} +      InConstantPool(false), OptimizationGoals(-1) {}  void ARMAsmPrinter::EmitFunctionBodyEnd() {    // Make sure to terminate any constant pools that were at the end @@ -106,9 +106,38 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {    Subtarget = &MF.getSubtarget<ARMSubtarget>();    SetupMachineFunction(MF); +  const Function* F = MF.getFunction(); +  const TargetMachine& TM = MF.getTarget(); + +  // Calculate this function's optimization goal. +  unsigned OptimizationGoal; +  if (F->hasFnAttribute(Attribute::OptimizeNone)) +    // For best debugging illusion, speed and small size sacrificed +    OptimizationGoal = 6; +  else if (F->optForMinSize()) +    // Aggressively for small size, speed and debug illusion sacrificed +    OptimizationGoal = 4; +  else if (F->optForSize()) +    // For small size, but speed and debugging illusion preserved +    OptimizationGoal = 3; +  else if (TM.getOptLevel() == CodeGenOpt::Aggressive) +    // Aggressively for speed, small size and debug illusion sacrificed +    OptimizationGoal = 2; +  else if (TM.getOptLevel() > CodeGenOpt::None) +    // For speed, but small size and good debug illusion preserved +    OptimizationGoal = 1; +  else // TM.getOptLevel() == CodeGenOpt::None +    // For good debugging, but speed and small size preserved +    OptimizationGoal = 5; + +  // Combine a new optimization goal with existing ones. +  if (OptimizationGoals == -1) // uninitialized goals +    OptimizationGoals = OptimizationGoal; +  else if (OptimizationGoals != (int)OptimizationGoal) // conflicting goals +    OptimizationGoals = 0;    if (Subtarget->isTargetCOFF()) { -    bool Internal = MF.getFunction()->hasInternalLinkage(); +    bool Internal = F->hasInternalLinkage();      COFF::SymbolStorageClass Scl = Internal ? COFF::IMAGE_SYM_CLASS_STATIC                                              : COFF::IMAGE_SYM_CLASS_EXTERNAL;      int Type = COFF::IMAGE_SYM_DTYPE_FUNCTION << COFF::SCT_COMPLEX_TYPE_SHIFT; @@ -506,6 +535,16 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {      // generates code that does this, it is always safe to set.      OutStreamer->EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);    } + +  // The last attribute to be emitted is ABI_optimization_goals +  MCTargetStreamer &TS = *OutStreamer->getTargetStreamer(); +  ARMTargetStreamer &ATS = static_cast<ARMTargetStreamer &>(TS); + +  if (OptimizationGoals > 0) +    ATS.emitAttribute(ARMBuildAttrs::ABI_optimization_goals, OptimizationGoals); +  OptimizationGoals = -1; + +  ATS.finishAttributeSection();  }  //===----------------------------------------------------------------------===// @@ -798,8 +837,6 @@ void ARMAsmPrinter::emitAttributes() {    else if (STI.hasVirtualization())      ATS.emitAttribute(ARMBuildAttrs::Virtualization_use,                        ARMBuildAttrs::AllowVirtualization); - -  ATS.finishAttributeSection();  }  //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.h b/llvm/lib/Target/ARM/ARMAsmPrinter.h index fb925f162f7..ed7be2de51c 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.h +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.h @@ -51,6 +51,11 @@ class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {    /// labels used for ARMv4t thumb code to make register indirect calls.    SmallVector<std::pair<unsigned, MCSymbol*>, 4> ThumbIndirectPads; +  /// OptimizationGoals - Maintain a combined optimization goal for all +  /// functions in a module: one of Tag_ABI_optimization_goals values, +  /// -1 if uninitialized, 0 if conflicting goals +  int OptimizationGoals; +  public:    explicit ARMAsmPrinter(TargetMachine &TM,                           std::unique_ptr<MCStreamer> Streamer); diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index f316ad17576..6084f22c847 100644 --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -79,7 +79,7 @@ class ARMTargetAsmStreamer : public ARMTargetStreamer {    void emitAttribute(unsigned Attribute, unsigned Value) override;    void emitTextAttribute(unsigned Attribute, StringRef String) override;    void emitIntTextAttribute(unsigned Attribute, unsigned IntValue, -                            StringRef StrinValue) override; +                            StringRef StringValue) override;    void emitArch(unsigned Arch) override;    void emitArchExtension(unsigned ArchExt) override;    void emitObjectArch(unsigned Arch) override; @@ -243,7 +243,7 @@ void ARMTargetAsmStreamer::emitUnwindRaw(int64_t Offset,  class ARMTargetELFStreamer : public ARMTargetStreamer {  private:    // This structure holds all attributes, accounting for -  // their string/numeric value, so we can later emmit them +  // their string/numeric value, so we can later emit them    // in declaration order, keeping all in the same vector    struct AttributeItem {      enum { @@ -254,7 +254,7 @@ private:      } Type;      unsigned Tag;      unsigned IntValue; -    StringRef StringValue; +    std::string StringValue;      static bool LessTag(const AttributeItem &LHS, const AttributeItem &RHS) {        // The conformance tag must be emitted first when serialised | 

