[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