From cc3d2dca60d1a624c6ecc8cc5c21aafdbfec5c0f Mon Sep 17 00:00:00 2001 From: Nick Kledzik Date: Wed, 9 Jan 2013 01:17:12 +0000 Subject: 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 --- lld/lib/Core/DefinedAtom.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 lld/lib/Core/DefinedAtom.cpp (limited to 'lld/lib/Core/DefinedAtom.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 + -- cgit v1.2.3