aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/ARM/ARMTargetMachine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/ARM/ARMTargetMachine.cpp')
-rw-r--r--lib/Target/ARM/ARMTargetMachine.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/Target/ARM/ARMTargetMachine.cpp b/lib/Target/ARM/ARMTargetMachine.cpp
index 9aa8308920..99ed63293d 100644
--- a/lib/Target/ARM/ARMTargetMachine.cpp
+++ b/lib/Target/ARM/ARMTargetMachine.cpp
@@ -28,6 +28,13 @@ EnableGlobalMerge("global-merge", cl::Hidden,
cl::desc("Enable global merge pass"),
cl::init(true));
+// @LOCALMOD-START
+namespace llvm {
+cl::opt<bool> FlagSfiDisableCP("sfi-disable-cp",
+ cl::desc("disable arm constant island pools"));
+}
+// @LOCALMOD-END
+
extern "C" void LLVMInitializeARMTarget() {
// Register the target.
RegisterTargetMachine<ARMTargetMachine> X(TheARMTarget);
@@ -189,8 +196,24 @@ bool ARMPassConfig::addPreEmitPass() {
addPass(UnpackMachineBundlesID);
}
+ // @LOCALMOD-START
+ // Note with FlagSfiDisableCP we effectively disable the
+ // ARMConstantIslandPass and rely on movt/movw to eliminate the need
+ // for constant islands
+ if (FlagSfiDisableCP) {
+ assert(getARMSubtarget().useMovt());
+ }
+ // @LOCALMOD-END
+
PM->add(createARMConstantIslandPass());
+ // @LOCALMOD-START
+ // This pass does all the heavy sfi lifting.
+ if (getARMSubtarget().isTargetNaCl()) {
+ PM->add(createARMNaClRewritePass());
+ }
+ // @LOCALMOD-END
+
return true;
}