Assert that the AddrDelta expression is really constant and wrap it in a set
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 22 Dec 2010 22:04:28 +0000 (22:04 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 22 Dec 2010 22:04:28 +0000 (22:04 +0000)
if we have a lame assembler.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122446 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCAssembler.cpp
lib/MC/MCObjectStreamer.cpp

index bff883672d37ef7a9ebff0c43c6ed16c6006fa37..3fd0c53c5cad19da326fade5a760495440ebc4e1 100644 (file)
@@ -687,7 +687,9 @@ bool MCAssembler::RelaxDwarfLineAddr(MCAsmLayout &Layout,
                                     MCDwarfLineAddrFragment &DF) {
   int64_t AddrDelta = 0;
   uint64_t OldSize = DF.getContents().size();
-  DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
+  bool IsAbs = DF.getAddrDelta().EvaluateAsAbsolute(AddrDelta, Layout);
+  (void)IsAbs;
+  assert(IsAbs);
   int64_t LineDelta;
   LineDelta = DF.getLineDelta();
   SmallString<8> &Data = DF.getContents();
index cbc66f1cf9b8415b99b53f9a8e375091d08e9f5a..af102ecf78a7d2201716e64ae5a648cf74e81341 100644 (file)
@@ -7,6 +7,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCObjectStreamer.h"
 
 #include "llvm/Support/ErrorHandling.h"
@@ -90,7 +91,7 @@ void MCObjectStreamer::EmitValueImpl(const MCExpr *Value, unsigned Size,
     return;
   }
   DF->addFixup(MCFixup::Create(DF->getContents().size(),
-                               AddValueSymbols(Value),
+                               Value,
                                MCFixup::getKindForSize(Size, isPCRel)));
   DF->getContents().resize(DF->getContents().size() + Size, 0);
 }
@@ -210,6 +211,11 @@ void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
     MCDwarfLineAddr::Emit(this, LineDelta, Res);
     return;
   }
+  if (!getContext().getAsmInfo().hasAggressiveSymbolFolding()) {
+    MCSymbol *ABS = getContext().CreateTempSymbol();
+    EmitAssignment(ABS, AddrDelta);
+    AddrDelta = MCSymbolRefExpr::Create(ABS, getContext());
+  }
   new MCDwarfLineAddrFragment(LineDelta, *AddrDelta, getCurrentSectionData());
 }