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

Hans Wennborg hans at chromium.org
Tue Feb 10 20:43:17 PST 2015


Merged in r228800.

On Tue, Feb 10, 2015 at 7:56 PM, Justin Bogner <mail at justinbogner.com> wrote:
> 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