[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