UndefinedAtom.h revision 360784
1//===- Core/UndefinedAtom.h - An Undefined Atom ---------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLD_CORE_UNDEFINED_ATOM_H
10#define LLD_CORE_UNDEFINED_ATOM_H
11
12#include "lld/Core/Atom.h"
13
14namespace lld {
15
16/// An UndefinedAtom has no content.
17/// It exists as a placeholder for a future atom.
18class UndefinedAtom : public Atom {
19public:
20  /// Whether this undefined symbol needs to be resolved,
21  /// or whether it can just evaluate to nullptr.
22  /// This concept is often called "weak", but that term
23  /// is overloaded to mean other things too.
24  enum CanBeNull {
25    /// Normal symbols must be resolved at build time
26    canBeNullNever,
27
28    /// This symbol can be missing at runtime and will evaluate to nullptr.
29    /// That is, the static linker still must find a definition (usually
30    /// is some shared library), but at runtime, the dynamic loader
31    /// will allow the symbol to be missing and resolved to nullptr.
32    ///
33    /// On Darwin this is generated using a function prototype with
34    /// __attribute__((weak_import)).
35    /// On linux this is generated using a function prototype with
36    ///  __attribute__((weak)).
37    /// On Windows this feature is not supported.
38    canBeNullAtRuntime,
39
40    /// This symbol can be missing at build time.
41    /// That is, the static linker will not error if a definition for
42    /// this symbol is not found at build time. Instead, the linker
43    /// will build an executable that lets the dynamic loader find the
44    /// symbol at runtime.
45    /// This feature is not supported on Darwin nor Windows.
46    /// On linux this is generated using a function prototype with
47    ///  __attribute__((weak)).
48    canBeNullAtBuildtime
49  };
50
51  virtual CanBeNull canBeNull() const = 0;
52
53  static bool classof(const Atom *a) {
54    return a->definition() == definitionUndefined;
55  }
56
57  static bool classof(const UndefinedAtom *) { return true; }
58
59protected:
60  UndefinedAtom() : Atom(definitionUndefined) {}
61
62  ~UndefinedAtom() override = default;
63};
64
65} // namespace lld
66
67#endif // LLD_CORE_UNDEFINED_ATOM_H
68