[PATCH] D66839: Fix stack address builtin for negative numbers

Zoe Carver via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 27 15:54:31 PDT 2019


zoecarver created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
zoecarver added reviewers: kparzysz, eli.friedman.
zoecarver marked an inline comment as done.
zoecarver added inline comments.


================
Comment at: clang/test/Sema/builtin-stackaddress.c:10
+// expected-error at +1 {{argument to '__builtin_return_address' must be a constant integer}}
+return __builtin_return_address(x);
 }
----------------
For some reason `lit` was still erroring here. 


This patch checks that an argument passed to either of the builtins `__builtin_frame_address` or `__builtin_return_address` is at least 0. This patch resolves the issue where these builtins would cause an infinite loop ( 25497 <https://bugs.llvm.org/show_bug.cgi?id=25497> ).


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D66839

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/Sema/builtin-stackaddress.c


Index: clang/test/Sema/builtin-stackaddress.c
===================================================================
--- clang/test/Sema/builtin-stackaddress.c
+++ clang/test/Sema/builtin-stackaddress.c
@@ -1,16 +1,30 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 %s
+
 void* a(unsigned x) {
 return __builtin_return_address(0);
 }
 
 void b(unsigned x) {
-return __builtin_return_address(x); // expected-error{{argument to '__builtin_return_address' must be a constant integer}}
+// TODO: lit doesn't catch this
+// expected-error at +1 {{argument to '__builtin_return_address' must be a constant integer}}
+return __builtin_return_address(x);
 }
 
 void* c(unsigned x) {
+// expected-error at +1 {{argument to '__builtin_return_address' must be at least 0}}
+return __builtin_return_address(-1);
+}
+
+void* d(unsigned x) {
 return __builtin_frame_address(0);
 }
 
-void d(unsigned x) {
-return __builtin_frame_address(x); // expected-error{{argument to '__builtin_frame_address' must be a constant integer}}
+void e(unsigned x) {
+// expected-error at +1 {{argument to '__builtin_frame_address' must be a constant integer}}
+return __builtin_frame_address(x);
+}
+
+void* f(unsigned x) {
+// expected-error at +1 {{argument to '__builtin_frame_address' must be at least 0}}
+return __builtin_frame_address(-1);
 }
Index: clang/lib/CodeGen/CGBuiltin.cpp
===================================================================
--- clang/lib/CodeGen/CGBuiltin.cpp
+++ clang/lib/CodeGen/CGBuiltin.cpp
@@ -2568,6 +2568,14 @@
   case Builtin::BI__builtin_return_address: {
     Value *Depth = ConstantEmitter(*this).emitAbstract(E->getArg(0),
                                                    getContext().UnsignedIntTy);
+    llvm::ConstantInt* DepthConstVal = dyn_cast<llvm::ConstantInt>(Depth);
+    if (!DepthConstVal)
+        CGM.ErrorUnsupported(E,
+                             "argument to '__builtin_return_address' must be a constant integer");
+    if (DepthConstVal->getSExtValue() < 0)
+        CGM.ErrorUnsupported(E,
+                             "argument to '__builtin_return_address' must be at least 0");
+
     Function *F = CGM.getIntrinsic(Intrinsic::returnaddress);
     return RValue::get(Builder.CreateCall(F, Depth));
   }
@@ -2578,6 +2586,14 @@
   case Builtin::BI__builtin_frame_address: {
     Value *Depth = ConstantEmitter(*this).emitAbstract(E->getArg(0),
                                                    getContext().UnsignedIntTy);
+    llvm::ConstantInt* DepthConstVal = dyn_cast<llvm::ConstantInt>(Depth);
+    if (!DepthConstVal)
+        CGM.ErrorUnsupported(E,
+                             "argument to '__builtin_frame_address' must be a constant integer");
+    if (DepthConstVal->getSExtValue() < 0)
+        CGM.ErrorUnsupported(E,
+                             "argument to '__builtin_frame_address' must be at least 0");
+
     Function *F = CGM.getIntrinsic(Intrinsic::frameaddress, AllocaInt8PtrTy);
     return RValue::get(Builder.CreateCall(F, Depth));
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D66839.217517.patch
Type: text/x-patch
Size: 3014 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190827/767900a8/attachment.bin>


More information about the cfe-commits mailing list