[PATCH] D20541: [esan|cfrag]: Add createCacheFragGV.
Qin Zhao via llvm-commits
llvm-commits at lists.llvm.org
Mon May 23 15:21:00 PDT 2016
zhaoqin updated this revision to Diff 58161.
zhaoqin added a comment.
Move createPrivateGlobalForString out of class.
Do not use ClTool* options.
http://reviews.llvm.org/D20541
Files:
lib/Transforms/Instrumentation/EfficiencySanitizer.cpp
Index: lib/Transforms/Instrumentation/EfficiencySanitizer.cpp
===================================================================
--- lib/Transforms/Instrumentation/EfficiencySanitizer.cpp
+++ lib/Transforms/Instrumentation/EfficiencySanitizer.cpp
@@ -80,6 +80,21 @@
return Options;
}
+// Create a constant for Str so that we can pass it to the run-time lib.
+static GlobalVariable *createPrivateGlobalForString(Module &M, StringRef Str,
+ bool AllowMerging) {
+ Constant *StrConst = ConstantDataArray::getString(M.getContext(), Str);
+ // We use private linkage for module-local strings. If they can be merged
+ // with another one, we set the unnamed_addr attribute.
+ GlobalVariable *GV =
+ new GlobalVariable(M, StrConst->getType(), true,
+ GlobalValue::PrivateLinkage, StrConst, "");
+ if (AllowMerging)
+ GV->setUnnamedAddr(true);
+ GV->setAlignment(1); // Strings may not be merged w/o setting align 1.
+ return GV;
+}
+
/// EfficiencySanitizer: instrument each module to find performance issues.
class EfficiencySanitizer : public ModulePass {
public:
@@ -93,6 +108,7 @@
private:
bool initOnModule(Module &M);
void initializeCallbacks(Module &M);
+ GlobalVariable *createCacheFragGV(Module &M);
GlobalVariable *createEsanInitToolGV(Module &M);
void createDestructor(Module &M, GlobalVariable *GV);
bool runOnFunction(Function &F, Module &M);
@@ -179,10 +195,42 @@
IRB.getInt32Ty(), IntptrTy, nullptr));
}
+// Create the global variable for the cache-fragmentation tool.
+GlobalVariable *EfficiencySanitizer::createCacheFragGV(Module &M) {
+ assert(Options.ToolType == EfficiencySanitizerOptions::ESAN_CacheFrag);
+
+ // This structure contains tool-specific information about each compilation
+ // unit (module) and is passed to the runtime library.
+ // This structure should be kept consistent with the CacheFragType in the
+ // runtime library cache_frag tool.
+ // struct CacheFragType {
+ // int ToolType;
+ // const char *UnitName;
+ // FIXME: add more entries for cache frag tool.
+ // };
+
+ IntegerType *Int32Ty = Type::getInt32Ty(*Ctx);
+ StructType *CacheFragType =
+ StructType::get(Int32Ty, IntptrTy, nullptr);
+
+ // Compilation unit name.
+ GlobalVariable *UnitName = createPrivateGlobalForString(
+ M, M.getModuleIdentifier(), /*AllowMerging*/ true);
+
+ GlobalVariable *CacheFragGV = new GlobalVariable(
+ M, CacheFragType, true, GlobalVariable::InternalLinkage,
+ ConstantStruct::get(CacheFragType,
+ ConstantInt::get(Int32Ty, Options.ToolType),
+ ConstantExpr::getPointerCast(UnitName, IntptrTy),
+ nullptr));
+ return CacheFragGV;
+}
+
// Create the tool-specific global variable passed to EsanInit and EsanExit.
GlobalVariable *EfficiencySanitizer::createEsanInitToolGV(Module &M) {
GlobalVariable *GV = nullptr;
- // FIXME: create the tool specific global variable.
+ if (Options.ToolType == EfficiencySanitizerOptions::ESAN_CacheFrag)
+ GV = createCacheFragGV(M);
if (GV == nullptr) {
GV = new GlobalVariable(M, IntptrTy, true, GlobalVariable::InternalLinkage,
Constant::getNullValue(IntptrTy));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20541.58161.patch
Type: text/x-patch
Size: 3342 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160523/61453088/attachment.bin>
More information about the llvm-commits
mailing list