summaryrefslogtreecommitdiffstats
path: root/lld/lib
diff options
context:
space:
mode:
authorNick Kledzik <kledzik@apple.com>2013-01-09 01:17:12 +0000
committerNick Kledzik <kledzik@apple.com>2013-01-09 01:17:12 +0000
commitcc3d2dca60d1a624c6ecc8cc5c21aafdbfec5c0f (patch)
tree9f4b11cc3ac5c78590c8071364714f011efee5f6 /lld/lib
parentb696c36fcd94339787d979c4ed6fb8cc9b83afdd (diff)
downloadbcm5719-llvm-cc3d2dca60d1a624c6ecc8cc5c21aafdbfec5c0f.tar.gz
bcm5719-llvm-cc3d2dca60d1a624c6ecc8cc5c21aafdbfec5c0f.zip
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. llvm-svn: 171929
Diffstat (limited to 'lld/lib')
-rw-r--r--lld/lib/Core/CMakeLists.txt1
-rw-r--r--lld/lib/Core/DefinedAtom.cpp78
-rw-r--r--lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp21
3 files changed, 92 insertions, 8 deletions
diff --git a/lld/lib/Core/CMakeLists.txt b/lld/lib/Core/CMakeLists.txt
index 5b0dca936ac..877da26aca3 100644
--- a/lld/lib/Core/CMakeLists.txt
+++ b/lld/lib/Core/CMakeLists.txt
@@ -1,6 +1,7 @@
set(LLVM_LINK_COMPONENTS support)
add_lld_library(lldCore
+ DefinedAtom.cpp
Error.cpp
File.cpp
InputFiles.cpp
diff --git a/lld/lib/Core/DefinedAtom.cpp b/lld/lib/Core/DefinedAtom.cpp
new file mode 100644
index 00000000000..191f12c96fd
--- /dev/null
+++ b/lld/lib/Core/DefinedAtom.cpp
@@ -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
+
diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
index 44234a135e4..93dcf214b43 100644
--- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
+++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
@@ -366,12 +366,13 @@ struct ScalarEnumerationTraits<lld::DefinedAtom::DeadStripKind> {
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 @@ struct ScalarEnumerationTraits<lld::DefinedAtom::ContentType> {
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 @@ struct MappingTraits<const lld::DefinedAtom*> {
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);
}
};
OpenPOWER on IntegriCloud