summaryrefslogtreecommitdiffstats
path: root/lld/lib/Core/DefinedAtom.cpp
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/Core/DefinedAtom.cpp
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/Core/DefinedAtom.cpp')
-rw-r--r--lld/lib/Core/DefinedAtom.cpp78
1 files changed, 78 insertions, 0 deletions
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
+
OpenPOWER on IntegriCloud