* Override the "EmitBytes" function, since it can sneak values in that way.
[oota-llvm.git] / lib / MC / MCAsmStreamer.cpp
index 636da33f9dfa9787229e6ccea94987371292e7ab..a1dcf2ed4a6e0e559e71bc6d7135cd5b9bd11ea8 100644 (file)
@@ -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);