diff options
| -rw-r--r-- | llvm/include/llvm/MC/MCDwarf.h | 3 | ||||
| -rw-r--r-- | llvm/include/llvm/MC/MCStreamer.h | 2 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 35 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/MC/ELF/cfi.s | 16 | 
8 files changed, 49 insertions, 23 deletions
diff --git a/llvm/include/llvm/MC/MCDwarf.h b/llvm/include/llvm/MC/MCDwarf.h index 65b920bf232..fd59280f672 100644 --- a/llvm/include/llvm/MC/MCDwarf.h +++ b/llvm/include/llvm/MC/MCDwarf.h @@ -438,7 +438,7 @@ struct MCDwarfFrameInfo {    MCDwarfFrameInfo()        : Begin(0), End(0), Personality(0), Lsda(0), Function(0), Instructions(),          PersonalityEncoding(), LsdaEncoding(0), CompactUnwindEncoding(0), -        IsSignalFrame(false) {} +        IsSignalFrame(false), IsSimple(false) {}    MCSymbol *Begin;    MCSymbol *End;    const MCSymbol *Personality; @@ -449,6 +449,7 @@ struct MCDwarfFrameInfo {    unsigned LsdaEncoding;    uint32_t CompactUnwindEncoding;    bool IsSignalFrame; +  bool IsSimple;  };  class MCDwarfFrameEmitter { diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index 4055d2b1d62..9a4bafe3cd7 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -626,7 +626,7 @@ public:    virtual void EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding);    virtual void EmitCFISections(bool EH, bool Debug); -  void EmitCFIStartProc(); +  void EmitCFIStartProc(bool IsSimple);    void EmitCFIEndProc();    virtual void EmitCFIDefCfa(int64_t Register, int64_t Offset);    virtual void EmitCFIDefCfaOffset(int64_t Offset); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp index a658d1e420e..0f41b93f994 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp @@ -113,7 +113,7 @@ void DwarfCFIException::beginFunction(const MachineFunction *MF) {    if (!shouldEmitPersonality && !shouldEmitMoves)      return; -  Asm->OutStreamer.EmitCFIStartProc(); +  Asm->OutStreamer.EmitCFIStartProc(/*IsSimple=*/false);    // Indicate personality routine, if any.    if (!shouldEmitPersonality) diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 12bcb68dd8a..d63716a815e 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -925,6 +925,8 @@ void MCAsmStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {    }    OS << "\t.cfi_startproc"; +  if (Frame.IsSimple) +    OS << " simple";    EmitEOL();  } diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index 12070f36ea6..fe20a6d9a98 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -889,7 +889,8 @@ namespace {                              unsigned personalityEncoding,                              const MCSymbol *lsda,                              bool IsSignalFrame, -                            unsigned lsdaEncoding); +                            unsigned lsdaEncoding, +                            bool IsSimple);      MCSymbol *EmitFDE(MCStreamer &streamer,                        const MCSymbol &cieStart,                        const MCDwarfFrameInfo &frame); @@ -1199,7 +1200,8 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,                                            unsigned personalityEncoding,                                            const MCSymbol *lsda,                                            bool IsSignalFrame, -                                          unsigned lsdaEncoding) { +                                          unsigned lsdaEncoding, +                                          bool IsSimple) {    MCContext &context = streamer.getContext();    const MCRegisterInfo *MRI = context.getRegisterInfo();    const MCObjectFileInfo *MOFI = context.getObjectFileInfo(); @@ -1298,9 +1300,11 @@ const MCSymbol &FrameEmitterImpl::EmitCIE(MCStreamer &streamer,    // Initial Instructions    const MCAsmInfo *MAI = context.getAsmInfo(); -  const std::vector<MCCFIInstruction> &Instructions = -      MAI->getInitialFrameState(); -  EmitCFIInstructions(streamer, Instructions, NULL); +  if (!IsSimple) { +    const std::vector<MCCFIInstruction> &Instructions = +        MAI->getInitialFrameState(); +    EmitCFIInstructions(streamer, Instructions, NULL); +  }    // Padding    streamer.EmitValueToAlignment(IsEH ? 4 : MAI->getPointerSize()); @@ -1386,18 +1390,20 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,  namespace {    struct CIEKey { -    static const CIEKey getEmptyKey() { return CIEKey(0, 0, -1, false); } -    static const CIEKey getTombstoneKey() { return CIEKey(0, -1, 0, false); } +    static const CIEKey getEmptyKey() { return CIEKey(0, 0, -1, false, false); } +    static const CIEKey getTombstoneKey() { return CIEKey(0, -1, 0, false, false); }      CIEKey(const MCSymbol* Personality_, unsigned PersonalityEncoding_, -           unsigned LsdaEncoding_, bool IsSignalFrame_) : +           unsigned LsdaEncoding_, bool IsSignalFrame_, bool IsSimple_) :        Personality(Personality_), PersonalityEncoding(PersonalityEncoding_), -      LsdaEncoding(LsdaEncoding_), IsSignalFrame(IsSignalFrame_) { +      LsdaEncoding(LsdaEncoding_), IsSignalFrame(IsSignalFrame_), +      IsSimple(IsSimple_) {      }      const MCSymbol* Personality;      unsigned PersonalityEncoding;      unsigned LsdaEncoding;      bool IsSignalFrame; +    bool IsSimple;    };  } @@ -1414,14 +1420,16 @@ namespace llvm {        return static_cast<unsigned>(hash_combine(Key.Personality,                                                  Key.PersonalityEncoding,                                                  Key.LsdaEncoding, -                                                Key.IsSignalFrame)); +                                                Key.IsSignalFrame, +                                                Key.IsSimple));      }      static bool isEqual(const CIEKey &LHS,                          const CIEKey &RHS) {        return LHS.Personality == RHS.Personality &&          LHS.PersonalityEncoding == RHS.PersonalityEncoding &&          LHS.LsdaEncoding == RHS.LsdaEncoding && -        LHS.IsSignalFrame == RHS.IsSignalFrame; +        LHS.IsSignalFrame == RHS.IsSignalFrame && +        LHS.IsSimple == RHS.IsSimple;      }    };  } @@ -1465,13 +1473,14 @@ void MCDwarfFrameEmitter::Emit(MCStreamer &Streamer, MCAsmBackend *MAB,    for (unsigned i = 0, n = FrameArray.size(); i < n; ++i) {      const MCDwarfFrameInfo &Frame = FrameArray[i];      CIEKey Key(Frame.Personality, Frame.PersonalityEncoding, -               Frame.LsdaEncoding, Frame.IsSignalFrame); +               Frame.LsdaEncoding, Frame.IsSignalFrame, Frame.IsSimple);      const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;      if (!CIEStart)        CIEStart = &Emitter.EmitCIE(Streamer, Frame.Personality,                                    Frame.PersonalityEncoding, Frame.Lsda,                                    Frame.IsSignalFrame, -                                  Frame.LsdaEncoding); +                                  Frame.LsdaEncoding, +                                  Frame.IsSimple);      FDEEnd = Emitter.EmitFDE(Streamer, *CIEStart, Frame); diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index a1d016261f5..10f4fbb04ef 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -2796,9 +2796,14 @@ bool AsmParser::parseDirectiveCFISections() {  }  /// parseDirectiveCFIStartProc -/// ::= .cfi_startproc +/// ::= .cfi_startproc [simple]  bool AsmParser::parseDirectiveCFIStartProc() { -  getStreamer().EmitCFIStartProc(); +  StringRef Simple; +  if (getLexer().isNot(AsmToken::EndOfStatement)) +    if (parseIdentifier(Simple) || Simple != "simple") +      return TokError("unexpected token in .cfi_startproc directive"); + +  getStreamer().EmitCFIStartProc(!Simple.empty());    return false;  } diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index 8cbfc5c83e5..996be956e90 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -248,12 +248,13 @@ void MCStreamer::EmitCFISections(bool EH, bool Debug) {    EmitDebugFrame = Debug;  } -void MCStreamer::EmitCFIStartProc() { +void MCStreamer::EmitCFIStartProc(bool IsSimple) {    MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();    if (CurFrame && !CurFrame->End)      report_fatal_error("Starting a frame before finishing the previous one!");    MCDwarfFrameInfo Frame; +  Frame.IsSimple = IsSimple;    EmitCFIStartProcImpl(Frame);    FrameInfos.push_back(Frame); diff --git a/llvm/test/MC/ELF/cfi.s b/llvm/test/MC/ELF/cfi.s index b8b6e6b52af..fd229b6064a 100644 --- a/llvm/test/MC/ELF/cfi.s +++ b/llvm/test/MC/ELF/cfi.s @@ -212,6 +212,11 @@ f36:          nop          .cfi_endproc +f37: +        .cfi_startproc simple +        nop +        .cfi_endproc +  // CHECK:        Section {  // CHECK:          Index: 4  // CHECK-NEXT:     Name: .eh_frame @@ -221,7 +226,7 @@ f36:  // CHECK-NEXT:     ]  // CHECK-NEXT:     Address: 0x0  // CHECK-NEXT:     Offset: 0x68 -// CHECK-NEXT:     Size: 1736 +// CHECK-NEXT:     Size: 1776  // CHECK-NEXT:     Link: 0  // CHECK-NEXT:     Info: 0  // CHECK-NEXT:     AddressAlignment: 8 @@ -337,7 +342,9 @@ f36:  // CHECK-NEXT:       0690: 00000000 1C000000 00000000 017A5052  // CHECK-NEXT:       06A0: 00017810 0A980000 00000000 00001B0C  // CHECK-NEXT:       06B0: 07089001 10000000 24000000 00000000 -// CHECK-NEXT:       06C0: 01000000 00000000 +// CHECK-NEXT:       06C0: 01000000 00000000 10000000 00000000 +// CHECK-NEXT:       06D0: 017A5200 01781001 1B000000 10000000 +// CHECK-NEXT:       06E0: 18000000 00000000 01000000 00000000  // CHECK-NEXT:     )  // CHECK-NEXT:   } @@ -348,8 +355,8 @@ f36:  // CHECK-NEXT:     Flags [  // CHECK-NEXT:     ]  // CHECK-NEXT:     Address: 0x0 -// CHECK-NEXT:     Offset: 0xE30 -// CHECK-NEXT:     Size: 1728 +// CHECK-NEXT:     Offset: 0xE70 +// CHECK-NEXT:     Size: 1752  // CHECK-NEXT:     Link: 7  // CHECK-NEXT:     Info: 4  // CHECK-NEXT:     AddressAlignment: 8 @@ -427,5 +434,6 @@ f36:  // CHECK-NEXT:       0x688 R_X86_64_PC32 .text 0x21  // CHECK-NEXT:       0x6A6 R_X86_64_PC64 foo   0x0  // CHECK-NEXT:       0x6BC R_X86_64_PC32 .text 0x22 +// CHECK-NEXT:       0x6E4 R_X86_64_PC32 .text 0x23  // CHECK-NEXT:     ]  // CHECK:        }  | 

