81 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
//===- InferFunctionAttrs.cpp - Infer implicit function attributes --------===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
 | 
						|
#include "llvm/Analysis/MemoryBuiltins.h"
 | 
						|
#include "llvm/Analysis/TargetLibraryInfo.h"
 | 
						|
#include "llvm/IR/Function.h"
 | 
						|
#include "llvm/IR/LLVMContext.h"
 | 
						|
#include "llvm/IR/Module.h"
 | 
						|
#include "llvm/Support/Debug.h"
 | 
						|
#include "llvm/Support/raw_ostream.h"
 | 
						|
#include "llvm/Transforms/Utils/BuildLibCalls.h"
 | 
						|
using namespace llvm;
 | 
						|
 | 
						|
#define DEBUG_TYPE "inferattrs"
 | 
						|
 | 
						|
static bool inferAllPrototypeAttributes(Module &M,
 | 
						|
                                        const TargetLibraryInfo &TLI) {
 | 
						|
  bool Changed = false;
 | 
						|
 | 
						|
  for (Function &F : M.functions())
 | 
						|
    // We only infer things using the prototype and the name; we don't need
 | 
						|
    // definitions.
 | 
						|
    if (F.isDeclaration() && !F.hasFnAttribute((Attribute::OptimizeNone)))
 | 
						|
      Changed |= inferLibFuncAttributes(F, TLI);
 | 
						|
 | 
						|
  return Changed;
 | 
						|
}
 | 
						|
 | 
						|
PreservedAnalyses InferFunctionAttrsPass::run(Module &M,
 | 
						|
                                              ModuleAnalysisManager &AM) {
 | 
						|
  auto &TLI = AM.getResult<TargetLibraryAnalysis>(M);
 | 
						|
 | 
						|
  if (!inferAllPrototypeAttributes(M, TLI))
 | 
						|
    // If we didn't infer anything, preserve all analyses.
 | 
						|
    return PreservedAnalyses::all();
 | 
						|
 | 
						|
  // Otherwise, we may have changed fundamental function attributes, so clear
 | 
						|
  // out all the passes.
 | 
						|
  return PreservedAnalyses::none();
 | 
						|
}
 | 
						|
 | 
						|
namespace {
 | 
						|
struct InferFunctionAttrsLegacyPass : public ModulePass {
 | 
						|
  static char ID; // Pass identification, replacement for typeid
 | 
						|
  InferFunctionAttrsLegacyPass() : ModulePass(ID) {
 | 
						|
    initializeInferFunctionAttrsLegacyPassPass(
 | 
						|
        *PassRegistry::getPassRegistry());
 | 
						|
  }
 | 
						|
 | 
						|
  void getAnalysisUsage(AnalysisUsage &AU) const override {
 | 
						|
    AU.addRequired<TargetLibraryInfoWrapperPass>();
 | 
						|
  }
 | 
						|
 | 
						|
  bool runOnModule(Module &M) override {
 | 
						|
    if (skipModule(M))
 | 
						|
      return false;
 | 
						|
 | 
						|
    auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
 | 
						|
    return inferAllPrototypeAttributes(M, TLI);
 | 
						|
  }
 | 
						|
};
 | 
						|
}
 | 
						|
 | 
						|
char InferFunctionAttrsLegacyPass::ID = 0;
 | 
						|
INITIALIZE_PASS_BEGIN(InferFunctionAttrsLegacyPass, "inferattrs",
 | 
						|
                      "Infer set function attributes", false, false)
 | 
						|
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
 | 
						|
INITIALIZE_PASS_END(InferFunctionAttrsLegacyPass, "inferattrs",
 | 
						|
                    "Infer set function attributes", false, false)
 | 
						|
 | 
						|
Pass *llvm::createInferFunctionAttrsLegacyPass() {
 | 
						|
  return new InferFunctionAttrsLegacyPass();
 | 
						|
}
 |