diff options
Diffstat (limited to 'llvm/lib')
| -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 | 
5 files changed, 34 insertions, 17 deletions
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);  | 

