blob: d12db2745feb95c7fa2e084b60d6fc6ce65ae3fb [file] [log] [blame]
Michael J. Spencer84487f12015-07-24 21:03:07 +00001//===- Symbols.cpp --------------------------------------------------------===//
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 "Symbols.h"
11#include "Chunks.h"
Rafael Espindola49a2ca62015-08-06 15:33:19 +000012#include "Error.h"
Michael J. Spencercdae0a42015-07-28 22:58:25 +000013#include "InputFiles.h"
Michael J. Spencer84487f12015-07-24 21:03:07 +000014
15using namespace llvm::object;
16
17using namespace lld;
18using namespace lld::elf2;
19
Michael J. Spencer84487f12015-07-24 21:03:07 +000020// Returns 1, 0 or -1 if this symbol should take precedence
21// over the Other, tie or lose, respectively.
Rui Ueyamaa7ccb292015-07-27 20:39:01 +000022int SymbolBody::compare(SymbolBody *Other) {
Rafael Espindola30e17972015-08-30 23:17:30 +000023 std::pair<bool, bool> L(isDefined(), !isWeak());
24 std::pair<bool, bool> R(Other->isDefined(), !Other->isWeak());
Rui Ueyamaa7ccb292015-07-27 20:39:01 +000025
Rafael Espindola3a63f3f2015-08-28 20:19:34 +000026 // Normalize
27 if (L > R)
Michael J. Spencer84487f12015-07-24 21:03:07 +000028 return -Other->compare(this);
Rui Ueyamaa7ccb292015-07-27 20:39:01 +000029
Rafael Espindola3a63f3f2015-08-28 20:19:34 +000030 if (L != R)
31 return -1;
Michael J. Spencer84487f12015-07-24 21:03:07 +000032
Rafael Espindola30e17972015-08-30 23:17:30 +000033 if (L.first && L.second) {
34 // FIXME: In the case where both are common we need to pick the largest
35 // and remember the alignment restriction.
36 if (isCommon())
37 return -1;
38 if (Other->isCommon())
39 return 1;
Michael J. Spencer84487f12015-07-24 21:03:07 +000040 return 0;
Rafael Espindola30e17972015-08-30 23:17:30 +000041 }
Rafael Espindola3a63f3f2015-08-28 20:19:34 +000042 return 1;
Michael J. Spencer84487f12015-07-24 21:03:07 +000043}