Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- SymbolRewriter.h - Symbol Rewriting Pass -----------------*- 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. // This file provides the prototypes and definitions related to the Symbol
  10. // Rewriter pass.
  11. //
  12. // The Symbol Rewriter pass takes a set of rewrite descriptors which define
  13. // transformations for symbol names.  These can be either single name to name
  14. // trnsformation or more broad regular expression based transformations.
  15. //
  16. // All the functions are re-written at the IR level.  The Symbol Rewriter itself
  17. // is exposed as a module level pass.  All symbols at the module level are
  18. // iterated.  For any matching symbol, the requested transformation is applied,
  19. // updating references to it as well (a la RAUW).  The resulting binary will
  20. // only contain the rewritten symbols.
  21. //
  22. // By performing this operation in the compiler, we are able to catch symbols
  23. // that would otherwise not be possible to catch (e.g. inlined symbols).
  24. //
  25. // This makes it possible to cleanly transform symbols without resorting to
  26. // overly-complex macro tricks and the pre-processor.  An example of where this
  27. // is useful is the sanitizers where we would like to intercept a well-defined
  28. // set of functions across the module.
  29. //
  30. //===----------------------------------------------------------------------===//
  31.  
  32. #ifndef LLVM_TRANSFORMS_UTILS_SYMBOLREWRITER_H
  33. #define LLVM_TRANSFORMS_UTILS_SYMBOLREWRITER_H
  34.  
  35. #include "llvm/IR/PassManager.h"
  36. #include <list>
  37. #include <memory>
  38. #include <string>
  39.  
  40. namespace llvm {
  41.  
  42. class MemoryBuffer;
  43. class Module;
  44. class ModulePass;
  45.  
  46. namespace yaml {
  47.  
  48. class KeyValueNode;
  49. class MappingNode;
  50. class ScalarNode;
  51. class Stream;
  52.  
  53. } // end namespace yaml
  54.  
  55. namespace SymbolRewriter {
  56.  
  57. /// The basic entity representing a rewrite operation.  It serves as the base
  58. /// class for any rewrite descriptor.  It has a certain set of specializations
  59. /// which describe a particular rewrite.
  60. ///
  61. /// The RewriteMapParser can be used to parse a mapping file that provides the
  62. /// mapping for rewriting the symbols.  The descriptors individually describe
  63. /// whether to rewrite a function, global variable, or global alias.  Each of
  64. /// these can be selected either by explicitly providing a name for the ones to
  65. /// be rewritten or providing a (posix compatible) regular expression that will
  66. /// select the symbols to rewrite.  This descriptor list is passed to the
  67. /// SymbolRewriter pass.
  68. class RewriteDescriptor {
  69. public:
  70.   enum class Type {
  71.     Invalid,        /// invalid
  72.     Function,       /// function - descriptor rewrites a function
  73.     GlobalVariable, /// global variable - descriptor rewrites a global variable
  74.     NamedAlias,     /// named alias - descriptor rewrites a global alias
  75.   };
  76.  
  77.   RewriteDescriptor(const RewriteDescriptor &) = delete;
  78.   RewriteDescriptor &operator=(const RewriteDescriptor &) = delete;
  79.   virtual ~RewriteDescriptor() = default;
  80.  
  81.   Type getType() const { return Kind; }
  82.  
  83.   virtual bool performOnModule(Module &M) = 0;
  84.  
  85. protected:
  86.   explicit RewriteDescriptor(Type T) : Kind(T) {}
  87.  
  88. private:
  89.   const Type Kind;
  90. };
  91.  
  92. using RewriteDescriptorList = std::list<std::unique_ptr<RewriteDescriptor>>;
  93.  
  94. class RewriteMapParser {
  95. public:
  96.   bool parse(const std::string &MapFile, RewriteDescriptorList *Descriptors);
  97.  
  98. private:
  99.   bool parse(std::unique_ptr<MemoryBuffer> &MapFile, RewriteDescriptorList *DL);
  100.   bool parseEntry(yaml::Stream &Stream, yaml::KeyValueNode &Entry,
  101.                   RewriteDescriptorList *DL);
  102.   bool parseRewriteFunctionDescriptor(yaml::Stream &Stream,
  103.                                       yaml::ScalarNode *Key,
  104.                                       yaml::MappingNode *Value,
  105.                                       RewriteDescriptorList *DL);
  106.   bool parseRewriteGlobalVariableDescriptor(yaml::Stream &Stream,
  107.                                             yaml::ScalarNode *Key,
  108.                                             yaml::MappingNode *Value,
  109.                                             RewriteDescriptorList *DL);
  110.   bool parseRewriteGlobalAliasDescriptor(yaml::Stream &YS, yaml::ScalarNode *K,
  111.                                          yaml::MappingNode *V,
  112.                                          RewriteDescriptorList *DL);
  113. };
  114.  
  115. } // end namespace SymbolRewriter
  116.  
  117. ModulePass *createRewriteSymbolsPass();
  118. ModulePass *createRewriteSymbolsPass(SymbolRewriter::RewriteDescriptorList &);
  119.  
  120. class RewriteSymbolPass : public PassInfoMixin<RewriteSymbolPass> {
  121. public:
  122.   RewriteSymbolPass() { loadAndParseMapFiles(); }
  123.  
  124.   RewriteSymbolPass(SymbolRewriter::RewriteDescriptorList &DL) {
  125.     Descriptors.splice(Descriptors.begin(), DL);
  126.   }
  127.  
  128.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  129.  
  130.   // Glue for old PM
  131.   bool runImpl(Module &M);
  132.  
  133. private:
  134.   void loadAndParseMapFiles();
  135.  
  136.   SymbolRewriter::RewriteDescriptorList Descriptors;
  137. };
  138.  
  139. } // end namespace llvm
  140.  
  141. #endif // LLVM_TRANSFORMS_UTILS_SYMBOLREWRITER_H
  142.