diff options
| author | Nick Kledzik <kledzik@apple.com> | 2013-01-09 01:17:12 +0000 |
|---|---|---|
| committer | Nick Kledzik <kledzik@apple.com> | 2013-01-09 01:17:12 +0000 |
| commit | cc3d2dca60d1a624c6ecc8cc5c21aafdbfec5c0f (patch) | |
| tree | 9f4b11cc3ac5c78590c8071364714f011efee5f6 /lld/lib | |
| parent | b696c36fcd94339787d979c4ed6fb8cc9b83afdd (diff) | |
| download | bcm5719-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.txt | 1 | ||||
| -rw-r--r-- | lld/lib/Core/DefinedAtom.cpp | 78 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp | 21 |
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); } }; |

