]> granicus.if.org Git - clang/commitdiff
wire -fbounds-checking to the new LLVM bounds checking pass
authorNuno Lopes <nunoplopes@sapo.pt>
Tue, 22 May 2012 17:19:45 +0000 (17:19 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Tue, 22 May 2012 17:19:45 +0000 (17:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157262 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/LangOptions.def
include/clang/Frontend/CodeGenOptions.h
lib/CodeGen/BackendUtil.cpp
lib/CodeGen/CGExpr.cpp
lib/CodeGen/CodeGenFunction.cpp
lib/Frontend/CompilerInvocation.cpp
test/CodeGen/bounds-checking.c

index a795c57881397cea5fea6a4b938e1a0b7925dd71..d2ce7c0df63e783879ae300833db74e331d43050 100644 (file)
@@ -157,7 +157,6 @@ BENIGN_LANGOPT(ConstexprCallDepth, 32, 512,
                "maximum constexpr call depth")
 BENIGN_LANGOPT(NumLargeByValueCopy, 32, 0, 
         "if non-zero, warn about parameter or return Warn if parameter/return value is larger in bytes than this setting. 0 is no check.")
-BENIGN_LANGOPT(BoundsChecking , 8, 0, "if non-zero, add run-time bounds checking code")
 VALUE_LANGOPT(MSCVersion, 32, 0, 
               "version of Microsoft Visual C/C++")
 
index 3181c0affd7e1a1ea3498265cbb1f637e9767ba3..be7f03fe13a82b2a689c59f08eb04184a4e25c00 100644 (file)
@@ -172,6 +172,9 @@ public:
   /// or 0 if unspecified.
   unsigned NumRegisterParameters;
 
+  /// The run-time penalty for bounds checking, or 0 to disable.
+  unsigned char BoundsChecking;
+
 public:
   CodeGenOptions() {
     AsmVerbose = 0;
@@ -224,6 +227,7 @@ public:
     VerifyModule = 1;
     StackRealignment = 0;
     StackAlignment = 0;
+    BoundsChecking = 0;
 
     DebugInfo = NoDebugInfo;
     Inlining = NoInlining;
index 9633dec1fe36e8a7456566162276cc2a0b78fec1..f889606475f6b247f9bf3ba191a16c209a81041e 100644 (file)
@@ -121,6 +121,12 @@ static void addObjCARCOptPass(const PassManagerBuilder &Builder, PassManagerBase
     PM.add(createObjCARCOptPass());
 }
 
+static unsigned BoundsChecking;
+static void addBoundsCheckingPass(const PassManagerBuilder &Builder,
+                                    PassManagerBase &PM) {
+  PM.add(createBoundsCheckingPass(BoundsChecking));
+}
+
 static void addAddressSanitizerPass(const PassManagerBuilder &Builder,
                                     PassManagerBase &PM) {
   PM.add(createAddressSanitizerPass());
@@ -160,6 +166,14 @@ void EmitAssemblyHelper::CreatePasses() {
                            addObjCARCOptPass);
   }
 
+  if (CodeGenOpts.BoundsChecking > 0) {
+    BoundsChecking = CodeGenOpts.BoundsChecking;
+    PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
+                           addBoundsCheckingPass);
+    PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+                           addBoundsCheckingPass);
+  }
+
   if (LangOpts.AddressSanitizer) {
     PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
                            addAddressSanitizerPass);
index 11b8ed254c985269a42bd5bbb87f5e6ac9df71de..190855d3a0d199f50c01e6ca1190e4ea4cebc791 100644 (file)
@@ -517,7 +517,7 @@ unsigned CodeGenFunction::getAccessedFieldNo(unsigned Idx,
 }
 
 void CodeGenFunction::EmitCheck(llvm::Value *Address, unsigned Size) {
-  if (BoundsChecking <= 0)
+  if (!CatchUndefined)
     return;
 
   // This needs to be to the standard address space.
index 5d108be273cc0518915ec47e76cb39dc1df95d04..dfb04b42aa5c12b39874de7b78bbae0eba318aab 100644 (file)
@@ -41,7 +41,6 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm)
     CXXVTTValue(0), OutermostConditional(0), TerminateLandingPad(0),
     TerminateHandler(0), TrapBB(0) {
 
-  BoundsChecking = getContext().getLangOpts().BoundsChecking;
   CatchUndefined = getContext().getLangOpts().CatchUndefined;
   CGM.getCXXABI().getMangleContext().startNewFunction();
 }
index 3a7efbcdab23e62db2e84e8a065cfc664c56c328..5a3732bf4370294de3994d3a749d6feb93bd996f 100644 (file)
@@ -283,6 +283,8 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {
     Res.push_back("-fobjc-dispatch-method=non-legacy");
     break;
   }
+  if (Opts.BoundsChecking > 0)
+    Res.push_back("-fbounds-checking=" + llvm::utostr(Opts.BoundsChecking));
   if (Opts.NumRegisterParameters)
     Res.push_back("-mregparm", llvm::utostr(Opts.NumRegisterParameters));
   if (Opts.NoGlobalMerge)
@@ -675,8 +677,6 @@ static void LangOptsToArgs(const LangOptions &Opts, ToArgsList &Res) {
     Res.push_back("-fno-operator-names");
   if (Opts.PascalStrings)
     Res.push_back("-fpascal-strings");
-  if (Opts.BoundsChecking > 0)
-    Res.push_back("-fbounds-checking=" + llvm::utostr(Opts.BoundsChecking));
   if (Opts.CatchUndefined)
     Res.push_back("-fcatch-undefined-behavior");
   if (Opts.AddressSanitizer)
@@ -1217,6 +1217,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
   Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
   Opts.RelocationModel = Args.getLastArgValue(OPT_mrelocation_model, "pic");
   Opts.TrapFuncName = Args.getLastArgValue(OPT_ftrap_function_EQ);
+  Opts.BoundsChecking = Args.getLastArgIntValue(OPT_fbounds_checking_EQ, 0,
+                                                Diags);
 
   Opts.FunctionSections = Args.hasArg(OPT_ffunction_sections);
   Opts.DataSections = Args.hasArg(OPT_fdata_sections);
@@ -1955,11 +1957,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
     Opts.ObjCNonFragileABI2 = true;
   Opts.ObjCDefaultSynthProperties =
     Args.hasArg(OPT_fobjc_default_synthesize_properties);
-  Opts.BoundsChecking = 0;
-  if ((Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior)))
-    Opts.BoundsChecking = 5;
-  Opts.BoundsChecking = Args.getLastArgIntValue(OPT_fbounds_checking_EQ,
-                                                Opts.BoundsChecking, Diags);
+  Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
   Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
   Opts.PackStruct = Args.getLastArgIntValue(OPT_fpack_struct_EQ, 0, Diags);
   Opts.PICLevel = Args.getLastArgIntValue(OPT_pic_level, 0, Diags);
index 3271b76dcbd2b85e9bfb66bbfc0bbf3e2c41f494..e2786203e6a785e86b8d61a9e2fb9e5a3426defd 100644 (file)
@@ -3,23 +3,24 @@
 // CHECK: @f
 double f(int b, int i) {
   double a[b];
+  // CHECK: trap
   return a[i];
-  // CHECK: objectsize.i64({{.*}}, i1 false)
-  // CHECK: icmp uge i64 {{.*}}, 8
 }
 
 // CHECK: @f2
 void f2() {
+  // everything is constant; no trap possible
+  // CHECK-NOT: trap
   int a[2];
-  // CHECK: objectsize.i64({{.*}}, i1 false)
-  // CHECK: icmp uge i64 {{.*}}, 4
   a[1] = 42;
   
   short *b = malloc(64);
-  // CHECK: objectsize.i64({{.*}}, i1 false)
-  // CHECK: icmp uge i64 {{.*}}, 4
-  // CHECK: getelementptr {{.*}}, i64 5
-  // CHECK: objectsize.i64({{.*}}, i1 false)
-  // CHECK: icmp uge i64 {{.*}}, 2
-  b[5] = a[1]+2;
+  b[5] = *a + a[1] + 2;
+}
+
+// CHECK: @f3
+void f3() {
+  int a[1];
+  // CHECK: trap
+  a[2] = 1;
 }