[llvm] r322131 - Use a MCExpr for the size of MCFillFragment.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 9 14:48:37 PST 2018
Author: rafael
Date: Tue Jan 9 14:48:37 2018
New Revision: 322131
URL: http://llvm.org/viewvc/llvm-project?rev=322131&view=rev
Log:
Use a MCExpr for the size of MCFillFragment.
This allows the size to be found during ralaxation. This fixes
pr35858.
Added:
llvm/trunk/test/MC/X86/eval-fill.s
Modified:
llvm/trunk/include/llvm/MC/MCFragment.h
llvm/trunk/lib/MC/MCAssembler.cpp
llvm/trunk/lib/MC/MCObjectStreamer.cpp
llvm/trunk/lib/MC/WasmObjectWriter.cpp
Modified: llvm/trunk/include/llvm/MC/MCFragment.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCFragment.h?rev=322131&r1=322130&r2=322131&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCFragment.h (original)
+++ llvm/trunk/include/llvm/MC/MCFragment.h Tue Jan 9 14:48:37 2018
@@ -422,14 +422,21 @@ class MCFillFragment : public MCFragment
uint8_t Value;
/// The number of bytes to insert.
- uint64_t Size;
+ const MCExpr &Size;
+
+ /// Source location of the directive that this fragment was created for.
+ SMLoc Loc;
public:
- MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr)
- : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {}
+ MCFillFragment(uint8_t Value, const MCExpr &Size, SMLoc Loc,
+ MCSection *Sec = nullptr)
+ : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size), Loc(Loc) {
+ }
uint8_t getValue() const { return Value; }
- uint64_t getSize() const { return Size; }
+ const MCExpr &getSize() const { return Size; }
+
+ SMLoc getLoc() const { return Loc; }
static bool classof(const MCFragment *F) {
return F->getKind() == MCFragment::FT_Fill;
Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=322131&r1=322130&r2=322131&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Tue Jan 9 14:48:37 2018
@@ -281,8 +281,18 @@ uint64_t MCAssembler::computeFragmentSiz
return cast<MCRelaxableFragment>(F).getContents().size();
case MCFragment::FT_CompactEncodedInst:
return cast<MCCompactEncodedInstFragment>(F).getContents().size();
- case MCFragment::FT_Fill:
- return cast<MCFillFragment>(F).getSize();
+ case MCFragment::FT_Fill: {
+ auto &FF = cast<MCFillFragment>(F);
+ int64_t Size = 0;
+ if (!FF.getSize().evaluateAsAbsolute(Size, Layout))
+ getContext().reportError(FF.getLoc(),
+ "expected assembly-time absolute expression");
+ if (Size < 0) {
+ getContext().reportError(FF.getLoc(), "invalid number of bytes");
+ return 0;
+ }
+ return Size;
+ }
case MCFragment::FT_LEB:
return cast<MCLEBFragment>(F).getContents().size();
@@ -540,7 +550,7 @@ static void writeFragment(const MCAssemb
for (unsigned I = 1; I < MaxChunkSize; ++I)
Data[I] = Data[0];
- uint64_t Size = FF.getSize();
+ uint64_t Size = FragmentSize;
for (unsigned ChunkSize = MaxChunkSize; ChunkSize; ChunkSize /= 2) {
StringRef Ref(Data, ChunkSize);
for (uint64_t I = 0, E = Size / ChunkSize; I != E; ++I)
Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=322131&r1=322130&r2=322131&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Tue Jan 9 14:48:37 2018
@@ -582,19 +582,8 @@ void MCObjectStreamer::emitFill(const MC
MCDataFragment *DF = getOrCreateDataFragment();
flushPendingLabels(DF, DF->getContents().size());
- int64_t IntNumBytes;
- if (!NumBytes.evaluateAsAbsolute(IntNumBytes, getAssembler())) {
- getContext().reportError(Loc, "expected absolute expression");
- return;
- }
-
- if (IntNumBytes < 0) {
- getContext().reportError(Loc, "invalid number of bytes");
- return;
- }
-
assert(getCurrentSectionOnly() && "need a section");
- insert(new MCFillFragment(FillValue, IntNumBytes));
+ insert(new MCFillFragment(FillValue, NumBytes, Loc));
}
void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size,
Modified: llvm/trunk/lib/MC/WasmObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WasmObjectWriter.cpp?rev=322131&r1=322130&r2=322131&view=diff
==============================================================================
--- llvm/trunk/lib/MC/WasmObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/WasmObjectWriter.cpp Tue Jan 9 14:48:37 2018
@@ -528,7 +528,10 @@ static void addData(SmallVectorImpl<char
Align->getMaxBytesToEmit());
DataBytes.resize(Size, Value);
} else if (auto *Fill = dyn_cast<MCFillFragment>(&Frag)) {
- DataBytes.insert(DataBytes.end(), Fill->getSize(), Fill->getValue());
+ int64_t Size;
+ if (!Fill->getSize().evaluateAsAbsolute(Size))
+ llvm_unreachable("The fill should be an assembler constant");
+ DataBytes.insert(DataBytes.end(), Size, Fill->getValue());
} else {
const auto &DataFrag = cast<MCDataFragment>(Frag);
const SmallVectorImpl<char> &Contents = DataFrag.getContents();
Added: llvm/trunk/test/MC/X86/eval-fill.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/eval-fill.s?rev=322131&view=auto
==============================================================================
--- llvm/trunk/test/MC/X86/eval-fill.s (added)
+++ llvm/trunk/test/MC/X86/eval-fill.s Tue Jan 9 14:48:37 2018
@@ -0,0 +1,17 @@
+// RUN: llvm-mc -filetype=obj %s -o - -triple x86_64-pc-linux | llvm-readobj -s | FileCheck %s
+
+// CHECK: Name: .text
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: SHF_ALLOC
+// CHECK-NEXT: SHF_EXECINSTR
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address:
+// CHECK-NEXT: Offset:
+// CHECK-NEXT: Size: 4092
+
+ .globl foo
+foo:
+ .space 4
+bar:
+ .space 4092 - (bar - foo)
More information about the llvm-commits
mailing list