summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Carter <jcarter@mips.com>2012-07-11 22:17:39 +0000
committerJack Carter <jcarter@mips.com>2012-07-11 22:17:39 +0000
commit1d82115042c81793cc3d807a8136f7f0f475f083 (patch)
tree014f158cda1df30133b30052c4fb1977bee94e77
parentd6a27413c27c73f3287cfb4dce1427f78496bcdf (diff)
downloadllvm-1d82115042c81793cc3d807a8136f7f0f475f083.tar.gz
llvm-1d82115042c81793cc3d807a8136f7f0f475f083.tar.bz2
llvm-1d82115042c81793cc3d807a8136f7f0f475f083.tar.xz
Patch for Mips direct object generation.
When WriteFragmentData() case FT_align called Asm.getBackend().writeNopData() is called, nothing is done since Mips implementation of writeNopData just returned "true". For some reason this has not caused problems in 32 bit mode, but in 64 bit mode it caused an assert when processing multiple function units. The test case included will assert without this patch. It runs twice with different flags to prevent false positives due to changes in code generation over time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160084 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
index d92c45d51d..575f2cfda5 100644
--- a/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
+++ b/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
@@ -216,6 +216,14 @@ public:
///
/// \return - True on success.
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const {
+ // Check for a less than instruction size number of bytes
+ // FIXME: 16 bit instructions are not handled yet here.
+ // We shouldn't be using a hard coded number for instruction size.
+ if (Count % 4) return false;
+
+ uint64_t NumNops = Count / 4;
+ for (uint64_t i = 0; i != NumNops; ++i)
+ OW->Write32(0);
return true;
}
}; // class MipsAsmBackend