summaryrefslogtreecommitdiff
path: root/contrib/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp')
-rw-r--r--contrib/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp211
1 files changed, 0 insertions, 211 deletions
diff --git a/contrib/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp b/contrib/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp
deleted file mode 100644
index a2c1ddfd279e..000000000000
--- a/contrib/llvm/lib/Transforms/Instrumentation/InstrOrderFile.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-//===- InstrOrderFile.cpp ---- Late IR instrumentation for order file ----===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/ADT/Statistic.h"
-#include "llvm/IR/CallSite.h"
-#include "llvm/IR/Constants.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/GlobalValue.h"
-#include "llvm/IR/IRBuilder.h"
-#include "llvm/IR/Instruction.h"
-#include "llvm/IR/Instructions.h"
-#include "llvm/IR/Metadata.h"
-#include "llvm/IR/Module.h"
-#include "llvm/Pass.h"
-#include "llvm/PassRegistry.h"
-#include "llvm/ProfileData/InstrProf.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Debug.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/Transforms/Instrumentation.h"
-#include "llvm/Transforms/Instrumentation/InstrOrderFile.h"
-#include <fstream>
-#include <map>
-#include <mutex>
-#include <set>
-#include <sstream>
-
-using namespace llvm;
-#define DEBUG_TYPE "instrorderfile"
-
-static cl::opt<std::string> ClOrderFileWriteMapping(
- "orderfile-write-mapping", cl::init(""),
- cl::desc(
- "Dump functions and their MD5 hash to deobfuscate profile data"),
- cl::Hidden);
-
-namespace {
-
-// We need a global bitmap to tell if a function is executed. We also
-// need a global variable to save the order of functions. We can use a
-// fixed-size buffer that saves the MD5 hash of the function. We need
-// a global variable to save the index into the buffer.
-
-std::mutex MappingMutex;
-
-struct InstrOrderFile {
-private:
- GlobalVariable *OrderFileBuffer;
- GlobalVariable *BufferIdx;
- GlobalVariable *BitMap;
- ArrayType *BufferTy;
- ArrayType *MapTy;
-
-public:
- InstrOrderFile() {}
-
- void createOrderFileData(Module &M) {
- LLVMContext &Ctx = M.getContext();
- int NumFunctions = 0;
- for (Function &F : M) {
- if (!F.isDeclaration())
- NumFunctions++;
- }
-
- BufferTy =
- ArrayType::get(Type::getInt64Ty(Ctx), INSTR_ORDER_FILE_BUFFER_SIZE);
- Type *IdxTy = Type::getInt32Ty(Ctx);
- MapTy = ArrayType::get(Type::getInt8Ty(Ctx), NumFunctions);
-
- // Create the global variables.
- std::string SymbolName = INSTR_PROF_ORDERFILE_BUFFER_NAME_STR;
- OrderFileBuffer = new GlobalVariable(M, BufferTy, false, GlobalValue::LinkOnceODRLinkage,
- Constant::getNullValue(BufferTy), SymbolName);
- Triple TT = Triple(M.getTargetTriple());
- OrderFileBuffer->setSection(
- getInstrProfSectionName(IPSK_orderfile, TT.getObjectFormat()));
-
- std::string IndexName = INSTR_PROF_ORDERFILE_BUFFER_IDX_NAME_STR;
- BufferIdx = new GlobalVariable(M, IdxTy, false, GlobalValue::LinkOnceODRLinkage,
- Constant::getNullValue(IdxTy), IndexName);
-
- std::string BitMapName = "bitmap_0";
- BitMap = new GlobalVariable(M, MapTy, false, GlobalValue::PrivateLinkage,
- Constant::getNullValue(MapTy), BitMapName);
- }
-
- // Generate the code sequence in the entry block of each function to
- // update the buffer.
- void generateCodeSequence(Module &M, Function &F, int FuncId) {
- if (!ClOrderFileWriteMapping.empty()) {
- std::lock_guard<std::mutex> LogLock(MappingMutex);
- std::error_code EC;
- llvm::raw_fd_ostream OS(ClOrderFileWriteMapping, EC, llvm::sys::fs::F_Append);
- if (EC) {
- report_fatal_error(Twine("Failed to open ") + ClOrderFileWriteMapping +
- " to save mapping file for order file instrumentation\n");
- } else {
- std::stringstream stream;
- stream << std::hex << MD5Hash(F.getName());
- std::string singleLine = "MD5 " + stream.str() + " " +
- std::string(F.getName()) + '\n';
- OS << singleLine;
- }
- }
-
- BasicBlock *OrigEntry = &F.getEntryBlock();
-
- LLVMContext &Ctx = M.getContext();
- IntegerType *Int32Ty = Type::getInt32Ty(Ctx);
- IntegerType *Int8Ty = Type::getInt8Ty(Ctx);
-
- // Create a new entry block for instrumentation. We will check the bitmap
- // in this basic block.
- BasicBlock *NewEntry =
- BasicBlock::Create(M.getContext(), "order_file_entry", &F, OrigEntry);
- IRBuilder<> entryB(NewEntry);
- // Create a basic block for updating the circular buffer.
- BasicBlock *UpdateOrderFileBB =
- BasicBlock::Create(M.getContext(), "order_file_set", &F, OrigEntry);
- IRBuilder<> updateB(UpdateOrderFileBB);
-
- // Check the bitmap, if it is already 1, do nothing.
- // Otherwise, set the bit, grab the index, update the buffer.
- Value *IdxFlags[] = {ConstantInt::get(Int32Ty, 0),
- ConstantInt::get(Int32Ty, FuncId)};
- Value *MapAddr = entryB.CreateGEP(MapTy, BitMap, IdxFlags, "");
- LoadInst *loadBitMap = entryB.CreateLoad(Int8Ty, MapAddr, "");
- entryB.CreateStore(ConstantInt::get(Int8Ty, 1), MapAddr);
- Value *IsNotExecuted =
- entryB.CreateICmpEQ(loadBitMap, ConstantInt::get(Int8Ty, 0));
- entryB.CreateCondBr(IsNotExecuted, UpdateOrderFileBB, OrigEntry);
-
- // Fill up UpdateOrderFileBB: grab the index, update the buffer!
- Value *IdxVal = updateB.CreateAtomicRMW(
- AtomicRMWInst::Add, BufferIdx, ConstantInt::get(Int32Ty, 1),
- AtomicOrdering::SequentiallyConsistent);
- // We need to wrap around the index to fit it inside the buffer.
- Value *WrappedIdx = updateB.CreateAnd(
- IdxVal, ConstantInt::get(Int32Ty, INSTR_ORDER_FILE_BUFFER_MASK));
- Value *BufferGEPIdx[] = {ConstantInt::get(Int32Ty, 0), WrappedIdx};
- Value *BufferAddr =
- updateB.CreateGEP(BufferTy, OrderFileBuffer, BufferGEPIdx, "");
- updateB.CreateStore(ConstantInt::get(Type::getInt64Ty(Ctx), MD5Hash(F.getName())),
- BufferAddr);
- updateB.CreateBr(OrigEntry);
- }
-
- bool run(Module &M) {
- createOrderFileData(M);
-
- int FuncId = 0;
- for (Function &F : M) {
- if (F.isDeclaration())
- continue;
- generateCodeSequence(M, F, FuncId);
- ++FuncId;
- }
-
- return true;
- }
-
-}; // End of InstrOrderFile struct
-
-class InstrOrderFileLegacyPass : public ModulePass {
-public:
- static char ID;
-
- InstrOrderFileLegacyPass() : ModulePass(ID) {
- initializeInstrOrderFileLegacyPassPass(
- *PassRegistry::getPassRegistry());
- }
-
- bool runOnModule(Module &M) override;
-};
-
-} // End anonymous namespace
-
-bool InstrOrderFileLegacyPass::runOnModule(Module &M) {
- if (skipModule(M))
- return false;
-
- return InstrOrderFile().run(M);
-}
-
-PreservedAnalyses
-InstrOrderFilePass::run(Module &M, ModuleAnalysisManager &AM) {
- if (InstrOrderFile().run(M))
- return PreservedAnalyses::none();
- return PreservedAnalyses::all();
-}
-
-INITIALIZE_PASS_BEGIN(InstrOrderFileLegacyPass, "instrorderfile",
- "Instrumentation for Order File", false, false)
-INITIALIZE_PASS_END(InstrOrderFileLegacyPass, "instrorderfile",
- "Instrumentation for Order File", false, false)
-
-char InstrOrderFileLegacyPass::ID = 0;
-
-ModulePass *llvm::createInstrOrderFilePass() {
- return new InstrOrderFileLegacyPass();
-}