]> granicus.if.org Git - llvm/commitdiff
[SSP] In opt remarks, stream Function directly
authorAdam Nemet <anemet@apple.com>
Thu, 9 Mar 2017 06:10:27 +0000 (06:10 +0000)
committerAdam Nemet <anemet@apple.com>
Thu, 9 Mar 2017 06:10:27 +0000 (06:10 +0000)
With this, it shows up as an attribute in YAML and non-printable characters
are properly removed by GlobalValue::getRealLinkageName.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297362 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/StackProtector.cpp
test/CodeGen/X86/stack-protector-remarks.ll

index 1753eda56d864874c0546f7c3cbc0972c5efeaa5..e3fdb96f62002ddbb2183dab246aca80d99804a2 100644 (file)
@@ -234,13 +234,12 @@ bool StackProtector::RequiresStackProtector() {
   // using the analysis pass to avoid building DominatorTree and LoopInfo which
   // are not available this late in the IR pipeline.
   OptimizationRemarkEmitter ORE(F);
-  auto ReasonStub =
-      Twine("Stack protection applied to function " + F->getName() + " due to ")
-          .str();
 
   if (F->hasFnAttribute(Attribute::StackProtectReq)) {
     ORE.emit(OptimizationRemark(DEBUG_TYPE, "StackProtectorRequested", F)
-             << ReasonStub << "a function attribute or command-line switch");
+             << "Stack protection applied to function "
+             << ore::NV("Function", F)
+             << " due to a function attribute or command-line switch");
     NeedsProtector = true;
     Strong = true; // Use the same heuristic as strong to determine SSPLayout
   } else if (F->hasFnAttribute(Attribute::StackProtectStrong))
@@ -256,8 +255,10 @@ bool StackProtector::RequiresStackProtector() {
         if (AI->isArrayAllocation()) {
           OptimizationRemark Remark(DEBUG_TYPE, "StackProtectorAllocaOrArray",
                                     &I);
-          Remark << ReasonStub
-                 << "a call to alloca or use of a variable length array";
+          Remark
+              << "Stack protection applied to function "
+              << ore::NV("Function", F)
+              << " due to a call to alloca or use of a variable length array";
           if (const auto *CI = dyn_cast<ConstantInt>(AI->getArraySize())) {
             if (CI->getLimitedValue(SSPBufferSize) >= SSPBufferSize) {
               // A call to alloca with size >= SSPBufferSize requires
@@ -285,8 +286,10 @@ bool StackProtector::RequiresStackProtector() {
           Layout.insert(std::make_pair(AI, IsLarge ? SSPLK_LargeArray
                                                    : SSPLK_SmallArray));
           ORE.emit(OptimizationRemark(DEBUG_TYPE, "StackProtectorBuffer", &I)
-                   << ReasonStub
-                   << "a stack allocated buffer or struct containing a buffer");
+                   << "Stack protection applied to function "
+                   << ore::NV("Function", F)
+                   << " due to a stack allocated buffer or struct containing a "
+                      "buffer");
           NeedsProtector = true;
           continue;
         }
@@ -296,7 +299,9 @@ bool StackProtector::RequiresStackProtector() {
           Layout.insert(std::make_pair(AI, SSPLK_AddrOf));
           ORE.emit(
               OptimizationRemark(DEBUG_TYPE, "StackProtectorAddressTaken", &I)
-              << ReasonStub << "the address of a local variable being taken");
+              << "Stack protection applied to function "
+              << ore::NV("Function", F)
+              << " due to the address of a local variable being taken");
           NeedsProtector = true;
         }
       }
index f5e34c43462be5aba5348cafa032fd375b42ff59..3792bef2742b21d6ba9371c901adb642ce0eeb8f 100644 (file)
 ; RUN: llc %s -mtriple=x86_64-unknown-unknown -o /dev/null 2>&1 | FileCheck %s -check-prefix=NOREMARK -allow-empty
 ; NOREMARK-NOT: ssp
 
+; RUN: llc %s -mtriple=x86_64-unknown-unknown -o /dev/null -pass-remarks-output=%t.yaml
+; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
+; YAML:      --- !Passed
+; YAML-NEXT: Pass:            stack-protector
+; YAML-NEXT: Name:            StackProtectorRequested
+; YAML-NEXT: Function:        attribute_ssp
+; YAML-NEXT: Args:
+; YAML-NEXT:   - String:          'Stack protection applied to function '
+; YAML-NEXT:   - Function:        attribute_ssp
+; YAML-NEXT:   - String:          ' due to a function attribute or command-line switch'
+; YAML-NEXT: ...
+
 define void @nossp() ssp {
   ret void
 }