Commit 7de24350 by Karl Schimpf

Add trap (an UDF instruction) to the ARM integrated Assembler.

Uses the same UDF instruction as used for function alignment. BUG= https://bugs.chromium.org/p/nativeclient/issues/detail?id=4334 R=stichnot@chromium.org Review URL: https://codereview.chromium.org/1519873003 .
parent 4175d45e
...@@ -1873,6 +1873,27 @@ void AssemblerARM32::sub(const Operand *OpRd, const Operand *OpRn, ...@@ -1873,6 +1873,27 @@ void AssemblerARM32::sub(const Operand *OpRd, const Operand *OpRn,
SubName); SubName);
} }
namespace {
// Use a particular UDF encoding -- TRAPNaCl in LLVM: 0xE7FEDEF0
// http://llvm.org/viewvc/llvm-project?view=revision&revision=173943
const uint8_t TrapBytesRaw[] = {0xE7, 0xFE, 0xDE, 0xF0};
const auto TrapBytes =
llvm::ArrayRef<uint8_t>(TrapBytesRaw, llvm::array_lengthof(TrapBytesRaw));
} // end of anonymous namespace
llvm::ArrayRef<uint8_t> AssemblerARM32::getNonExecBundlePadding() const {
return TrapBytes;
}
void AssemblerARM32::trap() {
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
for (const uint8_t &Byte : reverse_range(TrapBytes))
Buffer.emit<uint8_t>(Byte);
}
void AssemblerARM32::tst(const Operand *OpRn, const Operand *OpSrc1, void AssemblerARM32::tst(const Operand *OpRn, const Operand *OpSrc1,
CondARM32::Cond Cond) { CondARM32::Cond Cond) {
// TST (register) - ARM section A8.8.241, encoding A1: // TST (register) - ARM section A8.8.241, encoding A1:
......
...@@ -114,12 +114,10 @@ public: ...@@ -114,12 +114,10 @@ public:
void alignFunction() override { void alignFunction() override {
const SizeT Align = 1 << getBundleAlignLog2Bytes(); const SizeT Align = 1 << getBundleAlignLog2Bytes();
SizeT BytesNeeded = Utils::OffsetToAlignment(Buffer.getPosition(), Align); SizeT BytesNeeded = Utils::OffsetToAlignment(Buffer.getPosition(), Align);
constexpr IValueT UndefinedInst = 0xe7fedef0; // udf #60896
constexpr SizeT InstSize = sizeof(IValueT); constexpr SizeT InstSize = sizeof(IValueT);
assert(BytesNeeded % InstARM32::InstSize == 0); assert(BytesNeeded % InstARM32::InstSize == 0);
while (BytesNeeded > 0) { while (BytesNeeded > 0) {
AssemblerBuffer::EnsureCapacity ensured(&Buffer); trap();
emitInst(UndefinedInst);
BytesNeeded -= InstSize; BytesNeeded -= InstSize;
} }
} }
...@@ -128,12 +126,7 @@ public: ...@@ -128,12 +126,7 @@ public:
const char *getAlignDirective() const override { return ".p2alignl"; } const char *getAlignDirective() const override { return ".p2alignl"; }
llvm::ArrayRef<uint8_t> getNonExecBundlePadding() const override { llvm::ArrayRef<uint8_t> getNonExecBundlePadding() const override;
// Use a particular UDF encoding -- TRAPNaCl in LLVM: 0xE7FEDEF0
// http://llvm.org/viewvc/llvm-project?view=revision&revision=173943
static const uint8_t Padding[] = {0xE7, 0xFE, 0xDE, 0xF0};
return llvm::ArrayRef<uint8_t>(Padding, 4);
}
void padWithNop(intptr_t Padding) override; void padWithNop(intptr_t Padding) override;
...@@ -307,6 +300,8 @@ public: ...@@ -307,6 +300,8 @@ public:
// Implements sxtb/sxth depending on type of OpSrc0. // Implements sxtb/sxth depending on type of OpSrc0.
void sxt(const Operand *OpRd, const Operand *OpSrc0, CondARM32::Cond Cond); void sxt(const Operand *OpRd, const Operand *OpSrc0, CondARM32::Cond Cond);
void trap();
void tst(const Operand *OpRn, const Operand *OpSrc1, CondARM32::Cond Cond); void tst(const Operand *OpRn, const Operand *OpSrc1, CondARM32::Cond Cond);
void udiv(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1, void udiv(const Operand *OpRd, const Operand *OpRn, const Operand *OpSrc1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment