diff options
author | Petr Hosek <phosek@chromium.org> | 2016-05-28 05:57:48 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2016-05-28 05:57:48 +0000 |
commit | 67a94a795d760c963cb21ad851769c8fd7734883 (patch) | |
tree | 05ec726e2ece4eacb2764102ef734eeb630a954a /llvm/lib/MC/MCObjectStreamer.cpp | |
parent | 0d43c1c339ab5532c4527e92dc852b6e0f3f1788 (diff) | |
download | llvm-67a94a795d760c963cb21ad851769c8fd7734883.zip llvm-67a94a795d760c963cb21ad851769c8fd7734883.tar.gz llvm-67a94a795d760c963cb21ad851769c8fd7734883.tar.bz2 |
[MC] Support symbolic expressions in assembly directives
This matches the behavior of GNU assembler which supports symbolic
expressions in absolute expressions used in assembly directives.
Differential Revision: http://reviews.llvm.org/D20752
llvm-svn: 271102
Diffstat (limited to 'llvm/lib/MC/MCObjectStreamer.cpp')
-rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index b90f0a8..bf7d0f2 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -20,6 +20,7 @@ #include "llvm/MC/MCSection.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetRegistry.h" using namespace llvm; @@ -496,6 +497,43 @@ void MCObjectStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) { insert(new MCFillFragment(FillValue, NumBytes)); } +void MCObjectStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue, + SMLoc Loc) { + 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; + } + + EmitFill(IntNumBytes, FillValue); +} + +void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size, + int64_t Expr, SMLoc Loc) { + int64_t IntNumValues; + if (!NumValues.evaluateAsAbsolute(IntNumValues, getAssembler())) { + getContext().reportError(Loc, "expected absolute expression"); + return; + } + + if (IntNumValues < 0) { + getContext().getSourceManager()->PrintMessage( + Loc, SourceMgr::DK_Warning, + "'.fill' directive with negative repeat count has no effect"); + return; + } + + MCStreamer::emitFill(IntNumValues, Size, Expr); +} + void MCObjectStreamer::FinishImpl() { // If we are generating dwarf for assembly source files dump out the sections. if (getContext().getGenDwarfForAssembly()) |