diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-06-18 00:19:35 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-06-18 00:19:35 +0000 |
commit | edb15d6872c4475f45f3182960bd138acda6799e (patch) | |
tree | 7ee61138c7ee7fae94f03ae08f023afce7c77180 /lib/MC/MCAsmStreamer.cpp | |
parent | a3071455e540530ecb644a2e59098129f70ce705 (diff) |
* Override the "EmitBytes" function, since it can sneak values in that way.
* Make this used only if CFI is used.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@133319 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAsmStreamer.cpp')
-rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 636da33f9d..a1dcf2ed4a 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -1342,6 +1342,7 @@ public: Assignments.push_back(Value); MCAsmStreamer::EmitAssignment(Symbol, Value); } + virtual void EmitBytes(StringRef Data, unsigned AddrSpace); virtual void EmitIntValue(uint64_t Value, unsigned Size, unsigned AddrSpace = 0); virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, @@ -1360,6 +1361,22 @@ public: } // end anonymous namespace +void MCLSDADecoderAsmStreamer::EmitBytes(StringRef Data, unsigned AddrSpace) { + if (InLSDA && Data.size() == 1) { + LSDAEncoding.push_back((unsigned)(unsigned char)Data[0]); + ++BytesRead; + + if (LSDAEncoding.size() == 4) + // The fourth value tells us where the bottom of the type table is. + LSDASize = BytesRead + LSDAEncoding[3]; + else if (LSDAEncoding.size() == 6) + // The sixth value tells us where the start of the action table is. + ActionTableBytes = BytesRead; + } + + MCAsmStreamer::EmitBytes(Data, AddrSpace); +} + void MCLSDADecoderAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size, unsigned AddrSpace) { if (!InLSDA) @@ -1607,7 +1624,7 @@ MCStreamer *llvm::createAsmStreamer(MCContext &Context, ExceptionHandling::ExceptionsType ET = Context.getAsmInfo().getExceptionHandlingType(); - if (isVerboseAsm && + if (useCFI && isVerboseAsm && (ET == ExceptionHandling::SjLj || ET == ExceptionHandling::DwarfCFI)) return new MCLSDADecoderAsmStreamer(Context, OS, isVerboseAsm, useLoc, useCFI, IP, CE, TAB, ShowInst); |