]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lld/lib/Core/DefinedAtom.cpp
Bring lld (release_39 branch, r279477) to contrib
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lld / lib / Core / DefinedAtom.cpp
1 //===- DefinedAtom.cpp ------------------------------------------*- C++ -*-===//
2 //
3 //                             The LLVM Linker
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/Support/ErrorHandling.h"
11 #include "lld/Core/DefinedAtom.h"
12 #include "lld/Core/File.h"
13
14 namespace lld {
15
16 DefinedAtom::ContentPermissions DefinedAtom::permissions() const {
17   // By default base permissions on content type.
18   return permissions(this->contentType());
19 }
20
21 // Utility function for deriving permissions from content type
22 DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
23   switch (type) {
24   case typeCode:
25   case typeResolver:
26   case typeBranchIsland:
27   case typeBranchShim:
28   case typeStub:
29   case typeStubHelper:
30   case typeMachHeader:
31     return permR_X;
32
33   case typeConstant:
34   case typeCString:
35   case typeUTF16String:
36   case typeCFI:
37   case typeLSDA:
38   case typeLiteral4:
39   case typeLiteral8:
40   case typeLiteral16:
41   case typeDTraceDOF:
42   case typeCompactUnwindInfo:
43   case typeProcessedUnwindInfo:
44   case typeObjCImageInfo:
45   case typeObjCMethodList:
46     return permR__;
47
48   case typeData:
49   case typeDataFast:
50   case typeZeroFill:
51   case typeZeroFillFast:
52   case typeObjC1Class:
53   case typeLazyPointer:
54   case typeLazyDylibPointer:
55   case typeNonLazyPointer:
56   case typeThunkTLV:
57     return permRW_;
58
59   case typeGOT:
60   case typeConstData:
61   case typeCFString:
62   case typeInitializerPtr:
63   case typeTerminatorPtr:
64   case typeCStringPtr:
65   case typeObjCClassPtr:
66   case typeObjC2CategoryList:
67   case typeInterposingTuples:
68   case typeTLVInitialData:
69   case typeTLVInitialZeroFill:
70   case typeTLVInitializerPtr:
71     return permRW_L;
72
73   case typeUnknown:
74   case typeTempLTO:
75   case typeSectCreate:
76   case typeDSOHandle:
77     return permUnknown;
78   }
79   llvm_unreachable("unknown content type");
80 }
81
82 bool DefinedAtom::compareByPosition(const DefinedAtom *lhs,
83                                     const DefinedAtom *rhs) {
84   if (lhs == rhs)
85     return false;
86   const File *lhsFile = &lhs->file();
87   const File *rhsFile = &rhs->file();
88   if (lhsFile->ordinal() != rhsFile->ordinal())
89     return lhsFile->ordinal() < rhsFile->ordinal();
90   assert(lhs->ordinal() != rhs->ordinal());
91   return lhs->ordinal() < rhs->ordinal();
92 }
93
94 } // namespace