[llvm] r228793 - InstrProf: Lower coverage mappings by setting their sections appropriately

Justin Bogner mail at justinbogner.com
Tue Feb 10 19:56:49 PST 2015


Hey Hans,

Can we merge this in to 3.6? I'm the code owner here and it fixes
PR22531.

Thanks.

Justin Bogner <mail at justinbogner.com> writes:
> Author: bogner
> Date: Tue Feb 10 20:52:44 2015
> New Revision: 228793
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228793&view=rev
> Log:
> InstrProf: Lower coverage mappings by setting their sections appropriately
>
> Add handling for __llvm_coverage_mapping to the InstrProfiling
> pass. We need to make sure the constant and any profile names it
> refers to are in the correct sections, which is easier and cleaner to
> do here where we have to know about profiling sections anyway.
>
> This is really tricky to test without a frontend, so I'm committing
> the test for the fix in clang. If anyone knows a good way to test this
> within LLVM, please let me know.
>
> Fixes PR22531.
>
> Modified:
>     llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp?rev=228793&r1=228792&r2=228793&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/InstrProfiling.cpp Tue Feb 10 20:52:44 2015
> @@ -71,9 +71,17 @@ private:
>      return isMachO() ? "__DATA,__llvm_prf_data" : "__llvm_prf_data";
>    }
>  
> +  /// Get the section name for the coverage mapping data.
> +  StringRef getCoverageSection() const {
> +    return isMachO() ? "__DATA,__llvm_covmap" : "__llvm_covmap";
> +  }
> +
>    /// Replace instrprof_increment with an increment of the appropriate value.
>    void lowerIncrement(InstrProfIncrementInst *Inc);
>  
> +  /// Set up the section and uses for coverage data and its references.
> +  void lowerCoverageData(GlobalVariable *CoverageData);
> +
>    /// Get the region counters for an increment, creating them if necessary.
>    ///
>    /// If the counter array doesn't yet exist, the profile data variables
> @@ -118,6 +126,10 @@ bool InstrProfiling::runOnModule(Module
>            lowerIncrement(Inc);
>            MadeChange = true;
>          }
> +  if (GlobalVariable *Coverage = M.getNamedGlobal("__llvm_coverage_mapping")) {
> +    lowerCoverageData(Coverage);
> +    MadeChange = true;
> +  }
>    if (!MadeChange)
>      return false;
>  
> @@ -140,6 +152,35 @@ void InstrProfiling::lowerIncrement(Inst
>    Inc->eraseFromParent();
>  }
>  
> +void InstrProfiling::lowerCoverageData(GlobalVariable *CoverageData) {
> +  CoverageData->setSection(getCoverageSection());
> +  CoverageData->setAlignment(8);
> +
> +  Constant *Init = CoverageData->getInitializer();
> +  // We're expecting { i32, i32, i32, i32, [n x { i8*, i32, i32 }], [m x i8] }
> +  // for some C. If not, the frontend's given us something broken.
> +  assert(Init->getNumOperands() == 6 && "bad number of fields in coverage map");
> +  assert(isa<ConstantArray>(Init->getAggregateElement(4)) &&
> +         "invalid function list in coverage map");
> +  ConstantArray *Records = cast<ConstantArray>(Init->getAggregateElement(4));
> +  for (unsigned I = 0, E = Records->getNumOperands(); I < E; ++I) {
> +    Constant *Record = Records->getOperand(I);
> +    Value *V = const_cast<Value *>(Record->getOperand(0))->stripPointerCasts();
> +
> +    assert(isa<GlobalVariable>(V) && "Missing reference to function name");
> +    GlobalVariable *Name = cast<GlobalVariable>(V);
> +
> +    // If we have region counters for this name, we've already handled it.
> +    auto It = RegionCounters.find(Name);
> +    if (It != RegionCounters.end())
> +      continue;
> +
> +    // Move the name variable to the right section.
> +    Name->setSection(getNameSection());
> +    Name->setAlignment(1);
> +  }
> +}
> +
>  /// Get the name of a profiling variable for a particular function.
>  static std::string getVarName(InstrProfIncrementInst *Inc, StringRef VarName) {
>    auto *Arr = cast<ConstantDataArray>(Inc->getName()->getInitializer());
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list