Jelajahi Sumber

Add "PIE Level" metadata to module flags.

http://reviews.llvm.org/D19671

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267911 91177308-0d34-0410-b5e6-96231b3b80d8
Sriraman Tallam 9 tahun lalu
induk
melakukan
d41672fa69
3 mengubah file dengan 29 tambahan dan 0 penghapusan
  1. 11 0
      include/llvm/IR/Module.h
  2. 4 0
      include/llvm/Support/CodeGen.h
  3. 14 0
      lib/IR/Module.cpp

+ 11 - 0
include/llvm/IR/Module.h

@@ -732,6 +732,17 @@ public:
   void setPICLevel(PICLevel::Level PL);
 /// @}
 
+/// @}
+/// @name Utility functions for querying and setting PIE level
+/// @{
+
+  /// \brief Returns the PIE level (small or large model)
+  PIELevel::Level getPIELevel() const;
+
+  /// \brief Set the PIE level (small or large model)
+  void setPIELevel(PIELevel::Level PL);
+/// @}
+
   /// @name Utility functions for querying and setting PGO summary
   /// @{
 

+ 4 - 0
include/llvm/Support/CodeGen.h

@@ -32,6 +32,10 @@ namespace llvm {
     enum Level { Default=0, Small=1, Large=2 };
   }
 
+  namespace PIELevel {
+    enum Level { Default=0, Small=1, Large=2 };
+  }
+
   // TLS models.
   namespace TLSModel {
     enum Model {

+ 14 - 0
lib/IR/Module.cpp

@@ -497,6 +497,20 @@ void Module::setPICLevel(PICLevel::Level PL) {
   addModuleFlag(ModFlagBehavior::Error, "PIC Level", PL);
 }
 
+PIELevel::Level Module::getPIELevel() const {
+  auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIE Level"));
+
+  if (!Val)
+    return PIELevel::Default;
+
+  return static_cast<PIELevel::Level>(
+      cast<ConstantInt>(Val->getValue())->getZExtValue());
+}
+
+void Module::setPIELevel(PIELevel::Level PL) {
+  addModuleFlag(ModFlagBehavior::Error, "PIE Level", PL);
+}
+
 void Module::setMaximumFunctionCount(uint64_t Count) {
   addModuleFlag(ModFlagBehavior::Error, "MaxFunctionCount", Count);
 }