1 //===- llvm/CodeGen/GlobalMerge.h -------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CODEGEN_GLOBALMERGE_H 10 #define LLVM_CODEGEN_GLOBALMERGE_H 11 12 #include "llvm/IR/PassManager.h" 13 14 namespace llvm { 15 16 class TargetMachine; 17 18 struct GlobalMergeOptions { 19 // FIXME: Infer the maximum possible offset depending on the actual users 20 // (these max offsets are different for the users inside Thumb or ARM 21 // functions), see the code that passes in the offset in the ARM backend 22 // for more information. 23 unsigned MaxOffset = 0; 24 bool GroupByUse = true; 25 bool IgnoreSingleUse = true; 26 bool MergeConst = false; 27 /// Whether we should merge global variables that have external linkage. 28 bool MergeExternal = true; 29 /// Whether we should try to optimize for size only. 30 /// Currently, this applies a dead simple heuristic: only consider globals 31 /// used in minsize functions for merging. 32 /// FIXME: This could learn about optsize, and be used in the cost model. 33 bool SizeOnly = false; 34 }; 35 36 // FIXME: This pass must run before AsmPrinterPass::doInitialization! 37 class GlobalMergePass : public PassInfoMixin<GlobalMergePass> { 38 const TargetMachine *TM; 39 GlobalMergeOptions Options; 40 41 public: 42 GlobalMergePass(const TargetMachine *TM, GlobalMergeOptions Options) 43 : TM(TM), Options(Options) {} 44 45 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM); 46 }; 47 48 } // namespace llvm 49 50 #endif // LLVM_CODEGEN_GLOBALMERGE_H 51