aboutsummaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorMuhammad Omair Javaid <omair.javaid@linaro.org>2020-09-24 12:26:40 +0500
committerMuhammad Omair Javaid <omair.javaid@linaro.org>2020-09-24 12:26:40 +0500
commit8112d494d344dc0935d5c078f066a43d7c984e0c (patch)
tree02a89213de811008d87cf348af6295cb6fdd3dbd /lld
parentc367f93e8539c4d0bcdc86ad7ea7923e06231a93 (diff)
downloadllvm-8112d494d344dc0935d5c078f066a43d7c984e0c.zip
llvm-8112d494d344dc0935d5c078f066a43d7c984e0c.tar.gz
llvm-8112d494d344dc0935d5c078f066a43d7c984e0c.tar.bz2
Revert "[lld-macho] Initial support for common symbols"
This reverts commit 63ace77962543f961f1d566dd1243b1fb37129ef. Breaks LLDB Arm build: http://lab.llvm.org:8011/builders/lldb-arm-ubuntu/builds/4409
Diffstat (limited to 'lld')
-rw-r--r--lld/MachO/Driver.cpp27
-rw-r--r--lld/MachO/InputFiles.cpp8
-rw-r--r--lld/MachO/SymbolTable.cpp20
-rw-r--r--lld/MachO/SymbolTable.h3
-rw-r--r--lld/MachO/Symbols.h37
-rw-r--r--lld/MachO/SyntheticSections.h1
-rw-r--r--lld/test/MachO/common-symbol-coalescing.s83
7 files changed, 5 insertions, 174 deletions
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index e95a7350..5e1a498 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -436,31 +436,6 @@ static bool markSubLibrary(StringRef searchName) {
return false;
}
-// Replaces common symbols with defined symbols residing in __common sections.
-// This function must be called after all symbol names are resolved (i.e. after
-// all InputFiles have been loaded.) As a result, later operations won't see
-// any CommonSymbols.
-static void replaceCommonSymbols() {
- for (macho::Symbol *sym : symtab->getSymbols()) {
- auto *common = dyn_cast<CommonSymbol>(sym);
- if (common == nullptr)
- continue;
-
- auto *isec = make<InputSection>();
- isec->file = common->file;
- isec->name = section_names::common;
- isec->segname = segment_names::data;
- isec->align = common->align;
- isec->data = {nullptr, common->size};
- isec->flags = S_ZEROFILL;
- inputSections.push_back(isec);
-
- replaceSymbol<Defined>(sym, sym->getName(), isec, /*value=*/0,
- /*isWeakDef=*/false,
- /*isExternal=*/true);
- }
-}
-
static inline char toLowerDash(char x) {
if (x >= 'A' && x <= 'Z')
return x - 'A' + 'a';
@@ -664,8 +639,6 @@ bool macho::link(llvm::ArrayRef<const char *> argsArr, bool canExitEarly,
error("-sub_library " + searchName + " does not match a supplied dylib");
}
- replaceCommonSymbols();
-
StringRef orderFile = args.getLastArgValue(OPT_order_file);
if (!orderFile.empty())
parseOrderFile(orderFile);
diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp
index ad2d6a2..14eb1c4 100644
--- a/lld/MachO/InputFiles.cpp
+++ b/lld/MachO/InputFiles.cpp
@@ -243,12 +243,10 @@ void InputFile::parseSymbols(ArrayRef<structs::nlist_64> nList,
for (size_t i = 0, n = nList.size(); i < n; ++i) {
const structs::nlist_64 &sym = nList[i];
- if ((sym.n_type & N_TYPE) == N_UNDF) {
+ // Undefined symbol
+ if (!sym.n_sect) {
StringRef name = strtab + sym.n_strx;
- symbols[i] = sym.n_value == 0
- ? symtab->addUndefined(name)
- : symtab->addCommon(name, this, sym.n_value,
- 1 << GET_COMM_ALIGN(sym.n_desc));
+ symbols[i] = symtab->addUndefined(name);
continue;
}
diff --git a/lld/MachO/SymbolTable.cpp b/lld/MachO/SymbolTable.cpp
index 6719981..cfb3571 100644
--- a/lld/MachO/SymbolTable.cpp
+++ b/lld/MachO/SymbolTable.cpp
@@ -74,26 +74,6 @@ Symbol *SymbolTable::addUndefined(StringRef name) {
return s;
}
-Symbol *SymbolTable::addCommon(StringRef name, InputFile *file, uint64_t size,
- uint32_t align) {
- Symbol *s;
- bool wasInserted;
- std::tie(s, wasInserted) = insert(name);
-
- if (!wasInserted) {
- if (auto *common = dyn_cast<CommonSymbol>(s)) {
- if (size < common->size)
- return s;
- } else if (!isa<Undefined>(s)) {
- error("TODO: implement common symbol resolution with other symbol kinds");
- return s;
- }
- }
-
- replaceSymbol<CommonSymbol>(s, name, file, size, align);
- return s;
-}
-
Symbol *SymbolTable::addDylib(StringRef name, DylibFile *file, bool isWeakDef,
bool isTlv) {
Symbol *s;
diff --git a/lld/MachO/SymbolTable.h b/lld/MachO/SymbolTable.h
index b4c7ec8..178b26f 100644
--- a/lld/MachO/SymbolTable.h
+++ b/lld/MachO/SymbolTable.h
@@ -19,7 +19,6 @@ namespace macho {
class ArchiveFile;
class DylibFile;
-class InputFile;
class InputSection;
class MachHeaderSection;
class Symbol;
@@ -37,8 +36,6 @@ public:
Symbol *addUndefined(StringRef name);
- Symbol *addCommon(StringRef name, InputFile *, uint64_t size, uint32_t align);
-
Symbol *addDylib(StringRef name, DylibFile *file, bool isWeakDef, bool isTlv);
Symbol *addLazy(StringRef name, ArchiveFile *file,
diff --git a/lld/MachO/Symbols.h b/lld/MachO/Symbols.h
index 14c1ee8..8feab50 100644
--- a/lld/MachO/Symbols.h
+++ b/lld/MachO/Symbols.h
@@ -14,7 +14,6 @@
#include "lld/Common/ErrorHandler.h"
#include "lld/Common/Strings.h"
#include "llvm/Object/Archive.h"
-#include "llvm/Support/MathExtras.h"
namespace lld {
namespace macho {
@@ -37,7 +36,6 @@ public:
enum Kind {
DefinedKind,
UndefinedKind,
- CommonKind,
DylibKind,
LazyKind,
DSOHandleKind,
@@ -119,35 +117,6 @@ public:
static bool classof(const Symbol *s) { return s->kind() == UndefinedKind; }
};
-// On Unix, it is traditionally allowed to write variable definitions without
-// initialization expressions (such as "int foo;") to header files. These are
-// called tentative definitions.
-//
-// Using tentative definitions is usually considered a bad practice; you should
-// write only declarations (such as "extern int foo;") to header files.
-// Nevertheless, the linker and the compiler have to do something to support
-// bad code by allowing duplicate definitions for this particular case.
-//
-// The compiler creates common symbols when it sees tentative definitions.
-// (You can suppress this behavior and let the compiler create a regular
-// defined symbol by passing -fno-common.) When linking the final binary, if
-// there are remaining common symbols after name resolution is complete, the
-// linker converts them to regular defined symbols in a __common section.
-class CommonSymbol : public Symbol {
-public:
- CommonSymbol(StringRefZ name, InputFile *file, uint64_t size, uint32_t align)
- : Symbol(CommonKind, name), file(file), size(size),
- align(align != 1 ? align : llvm::PowerOf2Ceil(size)) {
- // TODO: cap maximum alignment
- }
-
- static bool classof(const Symbol *s) { return s->kind() == CommonKind; }
-
- InputFile *const file;
- const uint64_t size;
- const uint32_t align;
-};
-
class DylibSymbol : public Symbol {
public:
DylibSymbol(DylibFile *file, StringRefZ name, bool isWeakDef, bool isTlv)
@@ -216,10 +185,8 @@ public:
union SymbolUnion {
alignas(Defined) char a[sizeof(Defined)];
alignas(Undefined) char b[sizeof(Undefined)];
- alignas(CommonSymbol) char c[sizeof(CommonSymbol)];
- alignas(DylibSymbol) char d[sizeof(DylibSymbol)];
- alignas(LazySymbol) char e[sizeof(LazySymbol)];
- alignas(DSOHandle) char f[sizeof(DSOHandle)];
+ alignas(DylibSymbol) char c[sizeof(DylibSymbol)];
+ alignas(LazySymbol) char d[sizeof(LazySymbol)];
};
template <typename T, typename... ArgT>
diff --git a/lld/MachO/SyntheticSections.h b/lld/MachO/SyntheticSections.h
index 55fd15e..9086183 100644
--- a/lld/MachO/SyntheticSections.h
+++ b/lld/MachO/SyntheticSections.h
@@ -26,7 +26,6 @@ namespace macho {
namespace section_names {
constexpr const char pageZero[] = "__pagezero";
-constexpr const char common[] = "__common";
constexpr const char header[] = "__mach_header";
constexpr const char binding[] = "__binding";
constexpr const char weakBinding[] = "__weak_binding";
diff --git a/lld/test/MachO/common-symbol-coalescing.s b/lld/test/MachO/common-symbol-coalescing.s
deleted file mode 100644
index 88cec56..0000000
--- a/lld/test/MachO/common-symbol-coalescing.s
+++ /dev/null
@@ -1,83 +0,0 @@
-# REQUIRES: x86
-# RUN: split-file %s %t
-
-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/same-size.s -o %t/same-size.o
-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/smaller-size.s -o %t/smaller-size.o
-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/zero-align.s -o %t/zero-align.o
-# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/zero-align-round-up.s -o %t/zero-align-round-up.o
-
-## Check that we pick the definition with the larger size, regardless of
-## its alignment.
-# RUN: lld -flavor darwinnew %t/test.o %t/smaller-size.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=SMALLER-ALIGNMENT
-# RUN: lld -flavor darwinnew %t/smaller-size.o %t/test.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=SMALLER-ALIGNMENT
-
-## When the sizes are equal, we pick the symbol whose file occurs later in the
-## command-line argument list.
-# RUN: lld -flavor darwinnew %t/test.o %t/same-size.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=LARGER-ALIGNMENT
-# RUN: lld -flavor darwinnew %t/same-size.o %t/test.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=SMALLER-ALIGNMENT
-
-# RUN: lld -flavor darwinnew %t/test.o %t/zero-align.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=LARGER-ALIGNMENT
-# RUN: lld -flavor darwinnew %t/zero-align.o %t/test.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=LARGER-ALIGNMENT
-
-# RUN: lld -flavor darwinnew %t/test.o %t/zero-align-round-up.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=LARGER-ALIGNMENT
-# RUN: lld -flavor darwinnew %t/zero-align-round-up.o %t/test.o -order_file %t/order -o %t/test
-# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=LARGER-ALIGNMENT
-
-# SMALLER-ALIGNMENT-LABEL: Sections:
-# SMALLER-ALIGNMENT: __common {{[0-9a-f]+}} [[#%x, COMMON_START:]] BSS
-
-# SMALLER-ALIGNMENT-LABEL: SYMBOL TABLE:
-# SMALLER-ALIGNMENT-DAG: [[#COMMON_START]] g O __DATA,__common _check_size
-# SMALLER-ALIGNMENT-DAG: [[#COMMON_START + 2]] g O __DATA,__common _end_marker
-# SMALLER-ALIGNMENT-DAG: [[#COMMON_START + 8]] g O __DATA,__common _check_alignment
-
-# LARGER-ALIGNMENT-LABEL: Sections:
-# LARGER-ALIGNMENT: __common {{[0-9a-f]+}} [[#%x, COMMON_START:]] BSS
-
-# LARGER-ALIGNMENT-LABEL: SYMBOL TABLE:
-# LARGER-ALIGNMENT-DAG: [[#COMMON_START]] g O __DATA,__common _check_size
-# LARGER-ALIGNMENT-DAG: [[#COMMON_START + 2]] g O __DATA,__common _end_marker
-# LARGER-ALIGNMENT-DAG: [[#COMMON_START + 16]] g O __DATA,__common _check_alignment
-
-#--- order
-## Order is important as we determine the size of a given symbol via the
-## address of the next symbol.
-_check_size
-_end_marker
-_check_alignment
-
-#--- smaller-size.s
-.comm _check_size, 1, 1
-.comm _check_alignment, 1, 4
-
-#--- same-size.s
-.comm _check_size, 2, 1
-.comm _check_alignment, 2, 4
-
-#--- zero-align.s
-.comm _check_size, 2, 1
-## If alignment is set to zero, use the size to determine the alignment.
-.comm _check_alignment, 16, 0
-
-#--- zero-align-round-up.s
-.comm _check_size, 2, 1
-## If alignment is set to zero, use the size to determine the alignment. If the
-## size is not a power of two, round it up. (In this case, 14 rounds to 16.)
-.comm _check_alignment, 14, 0
-
-#--- test.s
-.comm _check_size, 2, 1
-.comm _end_marker, 1
-.comm _check_alignment, 2, 3
-
-.globl _main
-_main:
- ret