[llvm-commits] [lld] r171929 - in /lld/trunk: include/lld/Core/DefinedAtom.h lib/Core/CMakeLists.txt lib/Core/DefinedAtom.cpp lib/ReaderWriter/YAML/ReaderWriterYAML.cpp test/permissions.objtxt

Nick Kledzik kledzik at apple.com
Tue Jan 8 17:17:12 PST 2013


Author: kledzik
Date: Tue Jan  8 19:17:12 2013
New Revision: 171929

URL: http://llvm.org/viewvc/llvm-project?rev=171929&view=rev
Log:
Better tie together ContentType and Permissions. 

Since most content types (e.g. typeCode) have a 
preferred Permission, add a function to do that mapping.
Then hook up to YAML Reader and Writer such that
the 'permissions:' key does not need to be specified unless
overriding what the content type prefers.

Added:
    lld/trunk/lib/Core/DefinedAtom.cpp
    lld/trunk/test/permissions.objtxt
Modified:
    lld/trunk/include/lld/Core/DefinedAtom.h
    lld/trunk/lib/Core/CMakeLists.txt
    lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp

Modified: lld/trunk/include/lld/Core/DefinedAtom.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/DefinedAtom.h?rev=171929&r1=171928&r2=171929&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/DefinedAtom.h (original)
+++ lld/trunk/include/lld/Core/DefinedAtom.h Tue Jan  8 19:17:12 2013
@@ -123,6 +123,7 @@
     typeLiteral16,          // a sixteen-btye read-only constant
     typeData,               // read-write data
     typeZeroFill,           // zero-fill data
+    typeConstData,          // read-only data after dynamic linker is done
     typeObjC1Class,         // ObjC1 class [Darwin]
     typeLazyPointer,        // pointer through which a stub jumps
     typeLazyDylibPointer,   // pointer through which a stub jumps [Darwin]
@@ -152,6 +153,7 @@
     permRWX  = 8 + 4 + 2,   // mapped readable and writable and executable
     permRW_L = 8 + 4 + 1,   // initially mapped r/w, then made read-only
                             // loader writable
+    permUnknown = 16        // unknown or invalid permissions
   };
 
   enum SectionChoice {
@@ -230,7 +232,7 @@
   ///
   /// A function atom is R_X, a global variable is RW_, and a read-only constant
   /// is R__.
-  virtual ContentPermissions permissions() const = 0;
+  virtual ContentPermissions permissions() const;
 
   /// \brief only applicable to ARM code. Tells the linker if the code uses
   /// thumb or arm instructions.  The linker needs to know this to set the low
@@ -286,6 +288,9 @@
     return a->definition() == definitionRegular;
   }
 
+  /// Utility for deriving permissions from content type
+  static ContentPermissions permissions(ContentType type);
+
 protected:
   // DefinedAtom is an abstract base class. Only subclasses can access
   // constructor.

Modified: lld/trunk/lib/Core/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/CMakeLists.txt?rev=171929&r1=171928&r2=171929&view=diff
==============================================================================
--- lld/trunk/lib/Core/CMakeLists.txt (original)
+++ lld/trunk/lib/Core/CMakeLists.txt Tue Jan  8 19:17:12 2013
@@ -1,6 +1,7 @@
 set(LLVM_LINK_COMPONENTS support)
 
 add_lld_library(lldCore
+  DefinedAtom.cpp
   Error.cpp
   File.cpp
   InputFiles.cpp

Added: lld/trunk/lib/Core/DefinedAtom.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/DefinedAtom.cpp?rev=171929&view=auto
==============================================================================
--- lld/trunk/lib/Core/DefinedAtom.cpp (added)
+++ lld/trunk/lib/Core/DefinedAtom.cpp Tue Jan  8 19:17:12 2013
@@ -0,0 +1,78 @@
+//===- DefinedAtom.cpp ------------------------------------------*- C++ -*-===//
+//
+//                             The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Support/ErrorHandling.h"
+
+#include "lld/Core/DefinedAtom.h"
+
+
+namespace lld {
+
+
+DefinedAtom::ContentPermissions DefinedAtom::permissions() const {
+  // By default base permissions on content type.
+  return permissions(this->contentType());
+}
+
+// Utility function for deriving permissions from content type
+DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
+  switch (type) {
+  case typeCode:
+  case typeResolver:
+  case typeBranchIsland:
+  case typeBranchShim:
+  case typeStub:
+  case typeStubHelper:
+    return permR_X;
+ 
+  case typeConstant:
+  case typeCString:
+  case typeUTF16String:
+  case typeCFI:
+  case typeLSDA:
+  case typeLiteral4:
+  case typeLiteral8:
+  case typeLiteral16:
+  case typeDTraceDOF:
+  case typeCompactUnwindInfo:
+    return permR__;
+
+  case typeData:
+  case typeZeroFill:
+  case typeObjC1Class:
+  case typeLazyPointer:
+  case typeLazyDylibPointer:
+  case typeThunkTLV:
+    return permRW_;
+
+  case typeGOT:
+  case typeConstData:
+  case typeCFString:
+  case typeInitializerPtr:
+  case typeTerminatorPtr:
+  case typeCStringPtr:
+  case typeObjCClassPtr:
+  case typeObjC2CategoryList:
+  case typeTLVInitialData:
+  case typeTLVInitialZeroFill:
+  case typeTLVInitializerPtr:
+    return permRW_L;
+  
+  case typeUnknown:
+  case typeTempLTO:
+  case typeFirstInSection:
+  case typeLastInSection:
+    return permUnknown;
+  }
+  llvm_unreachable("unknown content type");
+}
+
+
+} // namespace
+

Modified: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp?rev=171929&r1=171928&r2=171929&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp (original)
+++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp Tue Jan  8 19:17:12 2013
@@ -366,12 +366,13 @@
 template <>
 struct ScalarEnumerationTraits<lld::DefinedAtom::ContentPermissions> {
   static void enumeration(IO &io, lld::DefinedAtom::ContentPermissions &value) {
-    io.enumCase(value, "---",  lld::DefinedAtom::perm___);
-    io.enumCase(value, "r--",  lld::DefinedAtom::permR__);
-    io.enumCase(value, "r-x",  lld::DefinedAtom::permR_X);
-    io.enumCase(value, "rw-",  lld::DefinedAtom::permRW_);
-    io.enumCase(value, "rwx",  lld::DefinedAtom::permRWX);
-    io.enumCase(value, "rw-l", lld::DefinedAtom::permRW_L);
+    io.enumCase(value, "---",     lld::DefinedAtom::perm___);
+    io.enumCase(value, "r--",     lld::DefinedAtom::permR__);
+    io.enumCase(value, "r-x",     lld::DefinedAtom::permR_X);
+    io.enumCase(value, "rw-",     lld::DefinedAtom::permRW_);
+    io.enumCase(value, "rwx",     lld::DefinedAtom::permRWX);
+    io.enumCase(value, "rw-l",    lld::DefinedAtom::permRW_L);
+    io.enumCase(value, "unknown", lld::DefinedAtom::permUnknown);
   }
 };
 
@@ -390,6 +391,8 @@
                           lld::DefinedAtom::typeData);
     io.enumCase(value, "zero-fill",           
                           lld::DefinedAtom::typeZeroFill);
+    io.enumCase(value, "const-data",                 
+                          lld::DefinedAtom::typeConstData);
     io.enumCase(value, "got",                 
                           lld::DefinedAtom::typeGOT);
     io.enumCase(value, "resolver",            
@@ -970,8 +973,10 @@
                                         StringRef());
     io.mapOptional("dead-strip",     keys->_deadStrip,     
                                         lld::DefinedAtom::deadStripNormal);
-    io.mapOptional("permissions",    keys->_permissions,   
-                                        lld::DefinedAtom::permR_X);
+    // default permissions based on content type
+    io.mapOptional("permissions",    keys->_permissions,  
+                                                lld::DefinedAtom::permissions(
+                                                           keys->_contentType));
     io.mapOptional("references",     keys->_references);
   }
 };

Added: lld/trunk/test/permissions.objtxt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/permissions.objtxt?rev=171929&view=auto
==============================================================================
--- lld/trunk/test/permissions.objtxt (added)
+++ lld/trunk/test/permissions.objtxt Tue Jan  8 19:17:12 2013
@@ -0,0 +1,57 @@
+# RUN: lld-core  %s  | FileCheck %s
+
+#
+# Test permissions for known content types are implicit, but can be overridden.
+#
+---
+defined-atoms:
+    - name:              one
+      type:              code
+
+    - name:              two
+      type:              data
+      permissions:       rw-
+      
+    - name:              three
+      type:              const-data
+      
+    - name:              four
+      type:              unknown
+      
+    - name:              oddCode
+      type:              code
+      permissions:       rwx
+
+    - name:              oddData
+      type:              data
+      permissions:       rwx
+     
+    - name:              oddConstData
+      type:              const-data
+      permissions:       rw-
+      
+    - name:              oddUnknown
+      type:              unknown
+      permissions:       rw-
+      
+...
+
+# CHECK:     ---
+# CHECK:     defined-atoms:
+# CHECK:     - name:         one
+# CHECK-NOT:   permissions:
+# CHECK:     - name:         two
+# CHECK-NOT:   permissions:
+# CHECK:     - name:         three
+# CHECK-NOT:   permissions:
+# CHECK:     - name:         four
+# CHECK-NOT:   permissions:
+# CHECK:     - name:         oddCode
+# CHECK:       permissions:  rwx
+# CHECK:     - name:         oddData
+# CHECK:       permissions:  rwx
+# CHECK:     - name:         oddConstData
+# CHECK:       permissions:  rw-
+# CHECK:     - name:         oddUnknown
+# CHECK:       permissions:  rw-
+# CHECK:     ...





More information about the llvm-commits mailing list