[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