diff options
author | David Sehr <sehr@chromium.org> | 2013-05-08 09:28:31 -0700 |
---|---|---|
committer | David Sehr <sehr@chromium.org> | 2013-05-08 09:28:31 -0700 |
commit | 8c9803a8981992ffd6bb1a901c9c3a52f2aedfce (patch) | |
tree | 1e47699dab33d564f63e44a4ad87aeb396fa39b3 /lib/Target/ARM/ARMTargetMachine.cpp | |
parent | 77cc10ffb869891e7eff5a5fa1be4437c3360cf8 (diff) |
Insert denominator zero checks for NaCl
This IR pass for ARM inserts a comparison and a branch to trap if the
denominator of a DIV or REM instruction is zero. This makes ARM fault
identically to x86 in this case.
BUG= https://code.google.com/p/nativeclient/issues/detail?id=2833
R=eliben@chromium.org
Review URL: https://codereview.chromium.org/14607004
Diffstat (limited to 'lib/Target/ARM/ARMTargetMachine.cpp')
-rw-r--r-- | lib/Target/ARM/ARMTargetMachine.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp index c02e981e54..499f974b96 100644 --- a/lib/Target/ARM/ARMTargetMachine.cpp +++ b/lib/Target/ARM/ARMTargetMachine.cpp @@ -20,6 +20,9 @@ #include "llvm/Support/FormattedStream.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Target/TargetOptions.h" +// @LOCALMOD-START +#include "llvm/Transforms/NaCl.h" +// @LOCALMOD-END #include "llvm/Transforms/Scalar.h" using namespace llvm; @@ -141,6 +144,9 @@ public: virtual bool addPreRegAlloc(); virtual bool addPreSched2(); virtual bool addPreEmitPass(); +// @LOCALMOD-START + virtual void addIRPasses(); +// @LOCALMOD-END }; } // namespace @@ -229,6 +235,15 @@ bool ARMPassConfig::addPreEmitPass() { return true; } +// @LOCALMOD-START +void ARMPassConfig::addIRPasses() { + if (getARMSubtarget().isTargetNaCl()) { + addPass(createInsertDivideCheckPass()); + } + TargetPassConfig::addIRPasses(); +} +// @LOCALMOD-END + bool ARMBaseTargetMachine::addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) { // Machine code emitter pass for ARM. |