/// \brief Parse a supplied buffer (already filled with the contents of a
/// file) and create a File object.
/// The resulting File object takes ownership of the MemoryBuffer.
- virtual std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const = 0;
+ virtual std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const class Registry &,
+ std::unique_ptr<File> &result) const = 0;
};
/// Walk the list of registered Readers and find one that can parse the
/// supplied file and parse it.
std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
- std::vector<std::unique_ptr<File>> &result) const;
+ std::unique_ptr<File> &result) const;
/// Walk the list of registered kind tables to convert a Reference Kind
/// name to a value.
_yamlHandlers.push_back(std::move(handler));
}
-std::error_code
-Registry::loadFile(std::unique_ptr<MemoryBuffer> mb,
- std::vector<std::unique_ptr<File>> &result) const {
+std::error_code Registry::loadFile(std::unique_ptr<MemoryBuffer> mb,
+ std::unique_ptr<File> &result) const {
// Get file magic.
StringRef content(mb->getBufferStart(), mb->getBufferSize());
llvm::sys::fs::file_magic fileType = llvm::sys::fs::identify_magic(content);
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr = ctx.getMemoryBuffer(path);
if (std::error_code ec = mbOrErr.getError())
return makeErrorFile(path, ec);
- std::vector<std::unique_ptr<File>> files;
- if (std::error_code ec = ctx.registry().loadFile(std::move(mbOrErr.get()), files))
+ std::unique_ptr<File> file;
+ if (std::error_code ec =
+ ctx.registry().loadFile(std::move(mbOrErr.get()), file))
return makeErrorFile(path, ec);
+ std::vector<std::unique_ptr<File>> files;
+ files.push_back(std::move(file));
for (std::unique_ptr<File> &pf : files) {
// If file is a dylib, inform LinkingContext about it.
if (SharedLibraryFile *shl = dyn_cast<SharedLibraryFile>(pf.get())) {
= MemoryBuffer::getFileOrSTDIN(path);
if (std::error_code ec = mb.getError())
return makeErrorFile(path, ec);
- std::vector<std::unique_ptr<File>> files;
- if (std::error_code ec = ctx.registry().loadFile(std::move(mb.get()), files))
+ std::unique_ptr<File> file;
+ if (std::error_code ec = ctx.registry().loadFile(std::move(mb.get()), file))
return makeErrorFile(path, ec);
+ std::vector<std::unique_ptr<File>> files;
+ files.push_back(std::move(file));
if (wholeArchive)
return parseMemberFiles(files);
return files;
return FileT::canParse(magic);
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const class Registry &,
+ std::unique_ptr<File> &result) const override {
if (std::error_code ec = FileT::isCompatible(*mb, _ctx))
return ec;
- result.push_back(llvm::make_unique<FileT>(std::move(mb), _ctx));
+ result = llvm::make_unique<FileT>(std::move(mb), _ctx);
return std::error_code();
}
std::unique_ptr<MemoryBuffer> memberMB(MemoryBuffer::getMemBuffer(
mb.getBuffer(), mb.getBufferIdentifier(), false));
- std::vector<std::unique_ptr<File>> files;
- if (std::error_code ec = _registry.loadFile(std::move(memberMB), files))
+ std::unique_ptr<File> file;
+ if (std::error_code ec = _registry.loadFile(std::move(memberMB), file))
return ec;
+ std::vector<std::unique_ptr<File>> files;
+ files.push_back(std::move(file));
assert(files.size() == 1);
result = std::move(files[0]);
if (std::error_code ec = result->parse())
return magic == llvm::sys::fs::file_magic::archive;
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®,
- std::vector<std::unique_ptr<File>> &result) const override {
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const Registry ®,
+ std::unique_ptr<File> &result) const override {
StringRef path = mb->getBufferIdentifier();
- std::unique_ptr<FileArchive> file(
- new FileArchive(std::move(mb), reg, path, _logLoading));
- result.push_back(std::move(file));
+ result =
+ llvm::make_unique<FileArchive>(std::move(mb), reg, path, _logLoading);
return std::error_code();
}
if (mbOrErr.getError())
return nullptr;
- std::vector<std::unique_ptr<File>> files;
- if (registry().loadFile(std::move(mbOrErr.get()), files))
+ std::unique_ptr<File> file;
+ if (registry().loadFile(std::move(mbOrErr.get()), file))
return nullptr;
+ std::vector<std::unique_ptr<File>> files;
+ files.push_back(std::move(file));
assert(files.size() == 1 && "expected one file in dylib");
files[0]->parse();
MachODylibFile* result = reinterpret_cast<MachODylibFile*>(files[0].get());
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Object/MachO.h"
#include "llvm/Support/Casting.h"
mb.getBufferSize() > 32);
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
- std::vector<std::unique_ptr<File>> &result) const override {
- auto *file = new MachOFile(std::move(mb), &_ctx);
- result.push_back(std::unique_ptr<MachOFile>(file));
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const Registry ®istry,
+ std::unique_ptr<File> &result) const override {
+ result = llvm::make_unique<MachOFile>(std::move(mb), &_ctx);
return std::error_code();
}
}
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry,
- std::vector<std::unique_ptr<File>> &result) const override {
- auto *file = new MachODylibFile(std::move(mb), &_ctx);
- result.push_back(std::unique_ptr<MachODylibFile>(file));
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const Registry ®istry,
+ std::unique_ptr<File> &result) const override {
+ result = llvm::make_unique<MachODylibFile>(std::move(mb), &_ctx);
return std::error_code();
}
return magic == llvm::sys::fs::file_magic::coff_object;
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry &,
+ std::unique_ptr<File> &result) const override {
// Parse the memory buffer as PECOFF file.
- auto *file = new FileCOFF(std::move(mb), _ctx);
- result.push_back(std::unique_ptr<File>(file));
+ result = llvm::make_unique<FileCOFF>(std::move(mb), _ctx);
return std::error_code();
}
return magic == llvm::sys::fs::file_magic::coff_import_library;
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File> > &result) const override {
- auto *file = new FileImportLibrary(std::move(mb), _ctx.getMachineType());
- result.push_back(std::unique_ptr<File>(file));
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const class Registry &,
+ std::unique_ptr<File> &result) const override {
+ result = llvm::make_unique<FileImportLibrary>(std::move(mb),
+ _ctx.getMachineType());
return std::error_code();
}
return ext.equals(".objtxt") || ext.equals(".yaml");
}
- std::error_code
- loadFile(std::unique_ptr<MemoryBuffer> mb, const class Registry &,
- std::vector<std::unique_ptr<File>> &result) const override {
+ std::error_code loadFile(std::unique_ptr<MemoryBuffer> mb,
+ const class Registry &,
+ std::unique_ptr<File> &result) const override {
// Create YAML Input Reader.
YamlContext yamlContext;
yamlContext._registry = &_registry;
// Fill vector with File objects created by parsing yaml.
std::vector<const lld::File *> createdFiles;
yin >> createdFiles;
+ assert(createdFiles.size() == 1);
// Error out now if there were parsing errors.
if (yin.error())
return make_error_code(lld::YamlReaderError::illegal_value);
std::shared_ptr<MemoryBuffer> smb(mb.release());
- for (const File *file : createdFiles) {
- // Note: loadFile() should return vector of *const* File
- File *f = const_cast<File *>(file);
- f->setLastError(std::error_code());
- f->setSharedMemoryBuffer(smb);
- result.emplace_back(f);
- }
+ const File *file = createdFiles[0];
+ // Note: loadFile() should return vector of *const* File
+ File *f = const_cast<File *>(file);
+ f->setLastError(std::error_code());
+ f->setSharedMemoryBuffer(smb);
+ result = std::unique_ptr<File>(f);
return make_error_code(lld::YamlReaderError::success);
}
--- /dev/null
+--- !archive
+members:
+ - name: bar.o
+ content: !native
+ defined-atoms:
+ - name: bar
+ scope: global
+ type: code
+
+ - name: bar2
+ type: code
+
+ - name: baz.o
+ content: !native
+ defined-atoms:
+ - name: baz
+ scope: global
+ type: code
+
+ - name: baz2
+ type: code
--- /dev/null
+--- !archive
+members:
+ - name: bar1.o
+ content: !native
+ defined-atoms:
+ - name: bar1
+ scope: global
+ type: code
+
+ - name: bar1b
+ type: code
+
+ undefined-atoms:
+ - name: baz1
+
+ - name: bar2.o
+ content: !native
+ defined-atoms:
+ - name: bar2
+ scope: global
+ type: code
+
+ - name: bar2b
+ type: code
--- /dev/null
+--- !archive
+members:
+ - name: baz1.o
+ content: !native
+ defined-atoms:
+ - name: baz1
+ scope: global
+ type: code
+
+ - name: baz1b
+ type: code
+
+ - name: baz2.o
+ content: !native
+ defined-atoms:
+ - name: baz2
+ scope: global
+ type: code
+
+ - name: baz2b
+ type: code
--- /dev/null
+--- !archive
+members:
+ - name: bar.o
+ content: !native
+ defined-atoms:
+ - name: bar
+ scope: global
+ type: data
+
+ - name: bar2
+ type: data
--- /dev/null
+defined-atoms:
+ - name: f1
+ merge: as-weak
+ scope: global
+ references:
+ - kind: associate
+ target: f2
+ - name: f2
--- /dev/null
+defined-atoms:
+ - name: _inlineFunc1
+ scope: global
+ type: code
+ merge: as-weak
+
+ - name: _inlineFunc2
+ scope: global
+ type: code
+ merge: as-addressed-weak
+
+ - name: _inlineFunc3
+ scope: global
+ type: code
+ merge: as-weak
+
+ - name: _inlineFunc4
+ scope: global
+ type: code
+ merge: as-addressed-weak
--- /dev/null
+---
+defined-atoms:
+ - name: _none
+ code-model: none
--- /dev/null
+---
+defined-atoms:
+ - name: _mips_pic
+ code-model: mips-pic
--- /dev/null
+---
+defined-atoms:
+ - name: _mips_micro
+ code-model: mips-micro
--- /dev/null
+---
+defined-atoms:
+ - name: _mips_micro_pic
+ code-model: mips-micro-pic
--- /dev/null
+---
+defined-atoms:
+ - name: _mips_16
+ code-model: mips-16
--- /dev/null
+---
+defined-atoms:
+ - ref-name: L1
+ type: constant
+ content: [ 01, 02 ]
+ - ref-name: L2
+ type: constant
+ merge: by-content
+ content: [ 01, 02, 03, 04 ]
--- /dev/null
+---
+defined-atoms:
+ - ref-name: L2
+ type: constant
+ merge: by-content
+ content: [ 01, 23, 45, 67, 89, AB, CD, EF ]
+ - ref-name: L3
+ type: constant
+ merge: by-content
+ content: [ 01, 02, 03 ]
--- /dev/null
+---
+defined-atoms:
+ - ref-name: L2
+ type: c-string
+ merge: by-content
+ content: [ 68, 65, 6c, 6c, 6f, 00 ]
--- /dev/null
+---
+defined-atoms:
+ - ref-name: L2
+ type: c-string
+ merge: by-content
+ content: [ 74, 68, 65, 72, 65, 00 ]
--- /dev/null
+---
+defined-atoms:
+ - ref-name: L1
+ type: constant
+ merge: by-content
+ content: [ 01, 02, 03, 04 ]
+ section-choice: custom-required
+ section-name: .mysection
+
+ - ref-name: L2
+ type: constant
+ merge: by-content
+ content: [ 01, 02, 03, 04 ]
+ section-choice: custom-required
+ section-name: .mysection2
--- /dev/null
+---
+defined-atoms:
+ - ref-name: L1
+ type: constant
+ merge: by-content
+ content: [ 05, 06, 07, 08 ]
+ section-choice: custom-required
+ section-name: .mysection
+
+ - ref-name: L2
+ type: constant
+ merge: by-content
+ content: [ 01, 02, 03, 04 ]
--- /dev/null
+---
+defined-atoms:
+ - name: _foo2
+ dead-strip: never
--- /dev/null
+---
+defined-atoms:
+ - name: _foo3
+ dead-strip: always
--- /dev/null
+---
+defined-atoms:
+ - name: mydead2
+ scope: global
+ type: data
+
+ - name: bar
+ scope: global
+ type: data
--- /dev/null
+---
+defined-atoms:
+ - name: baz
+ scope: global
+ type: code
+
+ - name: mydead3
+ type: code
--- /dev/null
+---
+defined-atoms:
+ - name: myglobal2
+ scope: global
+ type: data
+
+ - name: bar
+ scope: hidden
+ type: data
--- /dev/null
+---
+defined-atoms:
+ - name: baz
+ scope: hidden
+ type: code
+
+ - name: mydead
+ type: code
--- /dev/null
+---
+absolute-atoms:
+ - name: absatom
+ value: 0
+ scope: global
--- /dev/null
+---
+defined-atoms:
+ - name: g1
+ scope: global
+ type: gnu-linkonce
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
--- /dev/null
+---
+defined-atoms:
+ - name: anotherfunction
+ scope: global
+ type: data
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: f3
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
+ - name: g1
+ scope: global
+ type: gnu-linkonce
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: f3
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
--- /dev/null
+---
+undefined-atoms:
+ - name: f3
+ can-be-null: never
--- /dev/null
+defined-atoms:
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
+ - name: g1
+ scope: global
+ type: gnu-linkonce
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
--- /dev/null
+---
+undefined-atoms:
+ - name: f1
+ can-be-null: never
--- /dev/null
+---
+defined-atoms:
+ - name: _inlineFunc
+ scope: global
+ type: code
+ merge: as-weak
--- /dev/null
+---
+defined-atoms:
+ - name: _inlineFunc
+ scope: global
+ type: code
+ merge: as-weak
--- /dev/null
+---
+defined-atoms:
+ - name: _foo
+ scope: global
+ type: data
--- /dev/null
+undefined-atoms:
+ - name: f1
+ can-be-null: never
--- /dev/null
+---
+defined-atoms:
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
+ - name: g1
+ scope: global
+ type: gnu-linkonce
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
--- /dev/null
+defined-atoms:
+ - name: g1
+ scope: global
+ type: group-comdat
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
--- /dev/null
+---
+defined-atoms:
+ - name: anotherfunction
+ scope: global
+ type: data
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: f3
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
+ - name: g1
+ scope: global
+ type: group-comdat
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: f3
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
--- /dev/null
+---
+undefined-atoms:
+ - name: f3
+ can-be-null: never
--- /dev/null
+---
+defined-atoms:
+ - name: f1
+ scope: global
+ type: code
+ - name: f2
+ scope: global
+ type: code
+ - name: g1
+ scope: global
+ type: code
+ - name: d1
+ scope: global
+ type: data
+ - name: g1
+ scope: global
+ type: group-comdat
+ references:
+ - kind: group-child
+ target: f1
+ - kind: group-child
+ target: f2
+ - kind: group-child
+ target: g1
+ - kind: group-child
+ target: d1
--- /dev/null
+---
+undefined-atoms:
+ - name: f1
+ can-be-null: never
--- /dev/null
+---
+shared-library-atoms:
+ - name: foo2
+ load-name: libc.so
+
+ - name: foo3
+ load-name: libc.so
+
+ - name: bar2
+ load-name: libc.so
+ can-be-null: at-runtime
+
+ - name: bar3
+ load-name: libc.so
+ can-be-null: at-runtime
+
+ - name: mismatchNull1
+ load-name: libc.so
+
+ - name: mismatchNull2
+ load-name: libc.so
+ can-be-null: at-runtime
+
+ - name: mismatchload1
+ load-name: libb.so
+
+ - name: mismatchload2
+ load-name: liba.so
--- /dev/null
+---
+defined-atoms:
+ - name: _foo
+ scope: global
+ type: data
+ content: [ 00, 00, 00, 00 ]
--- /dev/null
+---
+defined-atoms:
+ - name: bar
+ type: code
+
+undefined-atoms:
+ - name: malloc
+ - name: myfunc
--- /dev/null
+---
+defined-atoms:
+ - name: myfunc
+ scope: global
+ type: code
+
+undefined-atoms:
+ - name: free
--- /dev/null
+---
+defined-atoms:
+ - name: bar
+ type: code
+
+undefined-atoms:
+ - name: malloc
+ - name: myfunc
--- /dev/null
+---
+defined-atoms:
+ - name: myfunc
+ scope: global
+ type: code
+
+undefined-atoms:
+ - name: free
--- /dev/null
+defined-atoms:
+ - name: fallback1
+
+undefined-atoms:
+ - name: def1
+ fallback:
+ name: fallback3
--- /dev/null
+---
+undefined-atoms:
+ - name: bar1
+ can-be-null: never
+ - name: bar2
+ can-be-null: at-runtime
+ - name: bar3
+ can-be-null: at-buildtime
+ - name: bar4
+ can-be-null: at-runtime
+ - name: bar5
+ can-be-null: at-buildtime
+ - name: bar6
+ can-be-null: never
+ - name: bar7
+ can-be-null: at-buildtime
+ - name: bar8
+ can-be-null: never
+ - name: bar9
+ can-be-null: at-runtime
--- /dev/null
+---
+defined-atoms:
+ - name: _foo
+ scope: global
+ type: data
--- /dev/null
+---
+defined-atoms:
+ - name: _foo
+ merge: as-weak
+ scope: global
+ type: data
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/archive-basic.objtxt | FileCheck %s
#
# Tests archives in YAML. Tests that an undefined in a regular file will load
undefined-atoms:
- name: bar
---- !archive
-members:
- - name: bar.o
- content: !native
- defined-atoms:
- - name: bar
- scope: global
- type: code
-
- - name: bar2
- type: code
-
- - name: baz.o
- content: !native
- defined-atoms:
- - name: baz
- scope: global
- type: code
-
- - name: baz2
- type: code
...
# CHECK: name: foo
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/archive-chain.objtxt %p/Inputs/archive-chain2.objtxt | FileCheck %s
#
# Tests that an undefine in one archive can force a load from another archive.
undefined-atoms:
- name: bar1
-
---- !archive
-members:
- - name: bar1.o
- content: !native
- defined-atoms:
- - name: bar1
- scope: global
- type: code
-
- - name: bar1b
- type: code
-
- undefined-atoms:
- - name: baz1
-
- - name: bar2.o
- content: !native
- defined-atoms:
- - name: bar2
- scope: global
- type: code
-
- - name: bar2b
- type: code
-
---- !archive
-members:
- - name: baz1.o
- content: !native
- defined-atoms:
- - name: baz1
- scope: global
- type: code
-
- - name: baz1b
- type: code
-
- - name: baz2.o
- content: !native
- defined-atoms:
- - name: baz2
- scope: global
- type: code
-
- - name: baz2b
- type: code
...
# CHECK: name: foo
-# RUN: lld -core %s | FileCheck -check-prefix=CHK1 %s
-# RUN: lld -core --commons-search-archives %s | FileCheck -check-prefix=CHK2 %s
+# RUN: lld -core %s %p/Inputs/archive-tentdef-search.objtxt | FileCheck -check-prefix=CHK1 %s
+# RUN: lld -core --commons-search-archives %s %p/Inputs/archive-tentdef-search.objtxt | FileCheck -check-prefix=CHK2 %s
#
# Tests that -commons-search-archives cause core linker to look for overrides
scope: global
type: zero-fill
merge: as-tentative
-
---- !archive
-members:
- - name: bar.o
- content: !native
- defined-atoms:
- - name: bar
- scope: global
- type: data
-
- - name: bar2
- type: data
...
# CHK1: name: foo
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/associates.objtxt | FileCheck %s
---
defined-atoms:
- kind: associate
target: f2
- name: f2
----
-defined-atoms:
- - name: f1
- merge: as-weak
- scope: global
- references:
- - kind: associate
- target: f2
- - name: f2
...
# CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/auto-hide-coalesce.objtxt | FileCheck %s
#
# Tests auto-hide bit during coalescing
scope: global
type: code
merge: as-addressed-weak
----
-defined-atoms:
- - name: _inlineFunc1
- scope: global
- type: code
- merge: as-weak
-
- - name: _inlineFunc2
- scope: global
- type: code
- merge: as-addressed-weak
-
- - name: _inlineFunc3
- scope: global
- type: code
- merge: as-weak
-
- - name: _inlineFunc4
- scope: global
- type: code
- merge: as-addressed-weak
...
-# RUN: lld -core %s | FileCheck %s
-
+# RUN: lld -core %s %p/Inputs/code-model-attributes.objtxt \
+# RUN: %p/Inputs/code-model-attributes2.objtxt \
+# RUN: %p/Inputs/code-model-attributes3.objtxt \
+# RUN: %p/Inputs/code-model-attributes4.objtxt \
+# RUN: %p/Inputs/code-model-attributes5.objtxt | FileCheck %s
#
# Test that code model attributes are preserved
#
---
defined-atoms:
- name: _def
----
-defined-atoms:
- - name: _none
- code-model: none
----
-defined-atoms:
- - name: _mips_pic
- code-model: mips-pic
----
-defined-atoms:
- - name: _mips_micro
- code-model: mips-micro
----
-defined-atoms:
- - name: _mips_micro_pic
- code-model: mips-micro-pic
----
-defined-atoms:
- - name: _mips_16
- code-model: mips-16
...
# CHECK: name: _def
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/constants-coalesce.objtxt \
+# RUN: %p/Inputs/constants-coalesce2.objtxt | FileCheck %s
#
# Test that duplicate merge-by-content anonymous constants are coalesced
- ref-name: L1
type: constant
content: [ 01, 02 ]
----
-defined-atoms:
- - ref-name: L1
- type: constant
- content: [ 01, 02 ]
- - ref-name: L2
- type: constant
- merge: by-content
- content: [ 01, 02, 03, 04 ]
----
-defined-atoms:
- - ref-name: L2
- type: constant
- merge: by-content
- content: [ 01, 23, 45, 67, 89, AB, CD, EF ]
- - ref-name: L3
- type: constant
- merge: by-content
- content: [ 01, 02, 03 ]
...
# CHECK-NOT: name:
type: c-string
merge: by-content
content: [ 74, 68, 65, 72, 65, 00 ]
----
-defined-atoms:
- - ref-name: L2
- type: c-string
- merge: by-content
- content: [ 68, 65, 6c, 6c, 6f, 00 ]
----
-defined-atoms:
- - ref-name: L2
- type: c-string
- merge: by-content
- content: [ 74, 68, 65, 72, 65, 00 ]
...
# CHECK-NOT: name:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/custom-section-coalesce.objtxt \
+# RUN: %p/Inputs/custom-section-coalesce2.objtxt | FileCheck %s
#
# Test that custom sections are preserved when duplicate merge-by-content
type: constant
merge: by-content
content: [ 01, 02, 03, 04 ]
-
----
-defined-atoms:
- - ref-name: L1
- type: constant
- merge: by-content
- content: [ 01, 02, 03, 04 ]
- section-choice: custom-required
- section-name: .mysection
-
- - ref-name: L2
- type: constant
- merge: by-content
- content: [ 01, 02, 03, 04 ]
- section-choice: custom-required
- section-name: .mysection2
----
-defined-atoms:
- - ref-name: L1
- type: constant
- merge: by-content
- content: [ 05, 06, 07, 08 ]
- section-choice: custom-required
- section-name: .mysection
-
- - ref-name: L2
- type: constant
- merge: by-content
- content: [ 01, 02, 03, 04 ]
...
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/dead-strip-attributes.objtxt \
+# RUN: %p/Inputs/dead-strip-attributes2.objtxt | FileCheck %s
#
# Test that dead strip attributes are preserved
defined-atoms:
- name: _foo1
dead-strip: normal
----
-defined-atoms:
- - name: _foo2
- dead-strip: never
----
-defined-atoms:
- - name: _foo3
- dead-strip: always
...
-# RUN: lld -core --dead-strip %s | FileCheck -check-prefix=CHK1 %s
-# RUN: lld -core %s | FileCheck -check-prefix=CHK2 %s
+# RUN: lld -core --dead-strip %s %p/Inputs/dead-strip-basic.objtxt %p/Inputs/dead-strip-basic2.objtxt | FileCheck -check-prefix=CHK1 %s
+# RUN: lld -core %s %p/Inputs/dead-strip-basic.objtxt %p/Inputs/dead-strip-basic2.objtxt | FileCheck -check-prefix=CHK2 %s
#
# Test that -dead-strip removes unreachable code and data
- name: bar
- name: baz
----
-defined-atoms:
- - name: mydead2
- scope: global
- type: data
-
- - name: bar
- scope: global
- type: data
----
-defined-atoms:
- - name: baz
- scope: global
- type: code
-
- - name: mydead3
- type: code
...
-# RUN: lld -core --dead-strip --keep-globals %s | FileCheck -check-prefix=CHK1 %s
-# RUN: lld -core --dead-strip %s | FileCheck -check-prefix=CHK2 %s
+# RUN: lld -core --dead-strip --keep-globals %s %p/Inputs/dead-strip-globals.objtxt %p/Inputs/dead-strip-globals2.objtxt | FileCheck -check-prefix=CHK1 %s
+# RUN: lld -core --dead-strip %s %p/Inputs/dead-strip-globals.objtxt %p/Inputs/dead-strip-globals2.objtxt | FileCheck -check-prefix=CHK2 %s
#
# Test that -keep-globals prevents -dead-strip from removing globals.
undefined-atoms:
- name: bar
- name: baz
----
-defined-atoms:
- - name: myglobal2
- scope: global
- type: data
-
- - name: bar
- scope: hidden
- type: data
----
-defined-atoms:
- - name: baz
- scope: hidden
- type: code
-
- - name: mydead
- type: code
...
-# RUN: not lld -core %s 2> %t.err
+# RUN: not lld -core %s %p/Inputs/error-duplicate-absolutes.objtxt 2> %t.err
# RUN: FileCheck %s < %t.err
#
scope: global
undefined-atoms:
- name: undefatom
----
-absolute-atoms:
- - name: absatom
- value: 0
- scope: global
...
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/gnulinkonce-rearrange-resolve.objtxt | FileCheck %s
#
# Test that gnu linkonce sections are parsed and the first section selected for symbol
- name: d1
scope: global
type: data
----
-defined-atoms:
- - name: g1
- scope: global
- type: gnu-linkonce
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
...
# CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/gnulinkonce-remaining-undef.objtxt \
+# RUN: %p/Inputs/gnulinkonce-remaining-undef2.objtxt | FileCheck %s
#
# Test that gnu linkonce sections are parsed and the first section selected for
target: g1
- kind: group-child
target: d1
----
-defined-atoms:
- - name: anotherfunction
- scope: global
- type: data
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: f3
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
- - name: g1
- scope: global
- type: gnu-linkonce
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: f3
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
----
-undefined-atoms:
- - name: f3
- can-be-null: never
...
#CHECK: - name: anotherfunction
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/gnulinkonce-resolve.objtxt | FileCheck %s
#
# Test that gnu linkonce sections are parsed and the first section selected for symbol
target: g1
- kind: group-child
target: d1
----
-defined-atoms:
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
- - name: g1
- scope: global
- type: gnu-linkonce
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
...
#CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/gnulinkonce-simple.objtxt | FileCheck %s
#
# Test that gnu linkonce sections are parsed properly when there is a reference to a
- name: anotherfunction
scope: global
type: data
----
-undefined-atoms:
- - name: f1
- can-be-null: never
...
#CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/inline-coalesce.objtxt %p/Inputs/inline-coalesce2.objtxt | FileCheck %s
#
# Test that non-inlined inlined functions are silently coalesced
scope: global
type: code
merge: as-weak
----
-defined-atoms:
- - name: _inlineFunc
- scope: global
- type: code
- merge: as-weak
----
-defined-atoms:
- - name: _inlineFunc
- scope: global
- type: code
- merge: as-weak
...
-# RUN: not lld -core %s 2>&1 | FileCheck %s
+# RUN: not lld -core %s %p/Inputs/multiple-def-error.objtxt 2>&1 | FileCheck %s
#
# Test that multiple definitions cause an error
- name: _foo
scope: global
type: data
----
-defined-atoms:
- - name: _foo
- scope: global
- type: data
...
# Test for section group members be preserved even if there is a
# reference to only one functions in the group.
-# RUN: lld -core --dead-strip %s | FileCheck %s
+# RUN: lld -core --dead-strip %s %p/Inputs/sectiongroup-deadstrip.objtxt | FileCheck %s
#
# Test that section groups are parsed properly when there is a reference to a
- name: anotherfunction
scope: global
type: data
----
-undefined-atoms:
- - name: f1
- can-be-null: never
...
#CHECK: defined-atoms:
-# RUN: not lld -core %s 2>&1 | FileCheck %s
+# RUN: not lld -core %s %p/Inputs/sectiongroup-gnulinkonce-error.objtxt 2>&1 | FileCheck %s
#
# Test that section groups/gnu linkonce sections are parsed and a merge error
target: g1
- kind: group-child
target: d1
----
-defined-atoms:
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
- - name: g1
- scope: global
- type: gnu-linkonce
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
...
#CHECK: SymbolTable: error while merging g1
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/sectiongroup-rearrange-resolve.objtxt | FileCheck %s
#
# Test that section groups are parsed and the first group selected for symbol
- name: d1
scope: global
type: data
----
-defined-atoms:
- - name: g1
- scope: global
- type: group-comdat
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
...
# CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/sectiongroup-remaining-undef.objtxt %p/Inputs/sectiongroup-remaining-undef2.objtxt | FileCheck %s
#
# Test that section groups are parsed and the first group selected for symbol
target: g1
- kind: group-child
target: d1
----
-defined-atoms:
- - name: anotherfunction
- scope: global
- type: data
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: f3
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
- - name: g1
- scope: global
- type: group-comdat
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: f3
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
----
-undefined-atoms:
- - name: f3
- can-be-null: never
...
#CHECK: - name: anotherfunction
target: g1
- kind: group-child
target: d1
----
-defined-atoms:
- - name: f1
- scope: global
- type: code
- - name: f2
- scope: global
- type: code
- - name: g1
- scope: global
- type: code
- - name: d1
- scope: global
- type: data
- - name: g1
- scope: global
- type: group-comdat
- references:
- - kind: group-child
- target: f1
- - kind: group-child
- target: f2
- - kind: group-child
- target: g1
- - kind: group-child
- target: d1
...
#CHECK: defined-atoms:
- name: anotherfunction
scope: global
type: data
----
-undefined-atoms:
- - name: f1
- can-be-null: never
...
#CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/shared-library-coalesce.objtxt | FileCheck %s
#
# Test that shared library symbols preserve their attributes and merge properly
- name: mismatchload2
load-name: libb.so
----
-shared-library-atoms:
- - name: foo2
- load-name: libc.so
-
- - name: foo3
- load-name: libc.so
-
- - name: bar2
- load-name: libc.so
- can-be-null: at-runtime
-
- - name: bar3
- load-name: libc.so
- can-be-null: at-runtime
-
- - name: mismatchNull1
- load-name: libc.so
-
- - name: mismatchNull2
- load-name: libc.so
- can-be-null: at-runtime
-
- - name: mismatchload1
- load-name: libb.so
-
- - name: mismatchload2
- load-name: liba.so
-
...
# CHECK: name: foo1
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/tent-merge.objtxt | FileCheck %s
#
# Test that a tentative definition and a regular global are merged into
scope: global
type: zero-fill
size: 4
----
-defined-atoms:
- - name: _foo
- scope: global
- type: data
- content: [ 00, 00, 00, 00 ]
...
-# RUN: not lld -core --undefines-are-errors %s 2> %t.err
+# RUN: not lld -core --undefines-are-errors %s %p/Inputs/undef-coalesce-error.objtxt %p/Inputs/undef-coalesce-error2.objtxt 2> %t.err
# RUN: FileCheck -check-prefix=CHECKERR %s < %t.err
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/undef-coalesce-error.objtxt %p/Inputs/undef-coalesce-error2.objtxt | FileCheck %s
#
# Test that -undefines-are-errors triggers and error
undefined-atoms:
- name: malloc
- name: free
----
-defined-atoms:
- - name: bar
- type: code
-
-undefined-atoms:
- - name: malloc
- - name: myfunc
----
-defined-atoms:
- - name: myfunc
- scope: global
- type: code
-
-undefined-atoms:
- - name: free
...
# CHECKERR: free
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/undef-coalesce.objtxt %p/Inputs/undef-coalesce2.objtxt | FileCheck %s
#
# Test that undefined symbols are coalesced with other undefined symbols
undefined-atoms:
- name: malloc
- name: free
----
-defined-atoms:
- - name: bar
- type: code
-
-undefined-atoms:
- - name: malloc
- - name: myfunc
----
-defined-atoms:
- - name: myfunc
- scope: global
- type: code
-
-undefined-atoms:
- - name: free
...
# CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %p/undef-fallback.objtxt %p/Inputs/undef-fallback.objtxt | FileCheck %s
# Test that fallback atoms can be parsed by YAML reader and processed by the
# core linker.
- name: undef2
fallback:
name: fallback2
----
-defined-atoms:
- - name: fallback1
-
-undefined-atoms:
- - name: def1
- fallback:
- name: fallback3
...
# CHECK: defined-atoms:
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/undef-weak-coalesce.objtxt| FileCheck %s
#
# Test that undefined symbols preserve their attributes and merge properly
can-be-null: at-runtime
- name: bar9
can-be-null: at-buildtime
----
-undefined-atoms:
- - name: bar1
- can-be-null: never
- - name: bar2
- can-be-null: at-runtime
- - name: bar3
- can-be-null: at-buildtime
- - name: bar4
- can-be-null: at-runtime
- - name: bar5
- can-be-null: at-buildtime
- - name: bar6
- can-be-null: never
- - name: bar7
- can-be-null: at-buildtime
- - name: bar8
- can-be-null: never
- - name: bar9
- can-be-null: at-runtime
...
# CHECK: - name: regular_func
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core %s %p/Inputs/weak-coalesce.objtxt \
+# RUN: %p/Inputs/weak-coalesce2.objtxt | FileCheck %s
-#
-# Test that weak definitions are coalesced away in favor of a regular definition
-#
-
----
-defined-atoms:
- - name: _foo
- merge: as-weak
- scope: global
- type: data
----
-defined-atoms:
- - name: _foo
- scope: global
- type: data
---
defined-atoms:
- name: _foo
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_OBJECT
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS ]
+ address: 0
+ content: [ 0xC3 ]
+global-symbols:
+ - name: _foo
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ desc: [ ]
+ value: 0
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+flags: [ ]
+install-name: /usr/lib/libSystem.B.dylib
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000000
+ content: [ 0x55 ]
+
+global-symbols:
+ - name: dyld_stub_binder
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
-# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t && \
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/native-and-mach-o.objtxt \
+# RUN: %p/Inputs/native-and-mach-o2.objtxt -o %t && \
# RUN: llvm-nm %t | FileCheck %s
#
# Test a mix of atoms and mach-o both encoded in yaml
undefined-atoms:
- name: _foo
-
---- !mach-o
-arch: x86_64
-file-type: MH_OBJECT
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS ]
- address: 0
- content: [ 0xC3 ]
-global-symbols:
- - name: _foo
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- desc: [ ]
- value: 0
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-flags: [ ]
-install-name: /usr/lib/libSystem.B.dylib
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- address: 0x0000000000000000
- content: [ 0x55 ]
-
-global-symbols:
- - name: dyld_stub_binder
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000000
-
-
...
# CHECK: {{[0-9a-f]+}} T _foo
--- /dev/null
+defined-atoms:
+ - name: .text
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
+ - name: main
+ scope: global
+ content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
+ 00, C3 ]
+ alignment: 16
+ section-choice: custom-required
+ section-name: .text
# RUN: lld -flavor gnu -target x86_64 --allow-multiple-definition %s \
+# RUN: %p/Inputs/allowduplicates.objtxt \
# RUN: --output-filetype=yaml --noinhibit-exec | FileCheck %s
#
-# RUN: not lld -flavor gnu -target x86_64 %s --output-filetype=yaml \
+# RUN: not lld -flavor gnu -target x86_64 %s %p/Inputs/allowduplicates.objtxt \
+# RUN: --output-filetype=yaml \
# RUN: --noinhibit-exec 2>&1 | FileCheck -check-prefix=ERROR %s
#
# RUN: lld -flavor gnu -target x86_64 -z muldefs %s \
+# RUN: %p/Inputs/allowduplicates.objtxt \
# RUN: --noinhibit-exec --output-filetype=yaml | FileCheck %s
---
section-choice: custom-required
section-name: .text
---
-defined-atoms:
- - name: .text
- alignment: 16
- section-choice: custom-required
- section-name: .text
- - name: main
- scope: global
- content: [ B8, 00, 00, 00, 00, C7, 44, 24, FC, 00, 00, 00,
- 00, C3 ]
- alignment: 16
- section-choice: custom-required
- section-name: .text
----
# CHECK: defined-atoms:
# CHECK: - name: .text
# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.objtxt', '.test']
+# excludes: A list of directories to exclude from the testsuite. The 'Inputs'
+# subdirectories contain auxiliary inputs for various tests in their parent
+# directories.
+config.excludes = ['Inputs']
+
# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: dyld_stub_binder
--- /dev/null
+--- !mach-o
+arch: armv7
+file-type: MH_OBJECT
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ alignment: 2
+ address: 0x0000000000000000
+ content: [ 0xFE, 0xFF, 0xFF, 0xEB, 0x02, 0x00, 0x00, 0xFA,
+ 0xFC, 0xFF, 0xFF, 0xEB, 0xFB, 0xFF, 0xFF, 0xFA,
+ 0x1E, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1 ]
+ relocations:
+ - offset: 0x0000000C
+ type: ARM_RELOC_BR24
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 4
+ - offset: 0x00000008
+ type: ARM_RELOC_BR24
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 3
+ - offset: 0x00000004
+ type: ARM_RELOC_BR24
+ length: 2
+ pc-rel: true
+ extern: false
+ symbol: 1
+ - offset: 0x00000000
+ type: ARM_RELOC_BR24
+ length: 2
+ pc-rel: true
+ extern: false
+ symbol: 1
+ - segment: __DATA
+ section: __data
+ type: S_REGULAR
+ attributes: [ ]
+ address: 0x0000000000000018
+ content: [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
+ relocations:
+ - offset: 0x00000004
+ type: ARM_RELOC_VANILLA
+ length: 2
+ pc-rel: false
+ extern: false
+ symbol: 1
+ - offset: 0x00000000
+ type: ARM_RELOC_VANILLA
+ length: 2
+ pc-rel: false
+ extern: true
+ symbol: 3
+local-symbols:
+ - name: _d2
+ type: N_SECT
+ sect: 2
+ value: 0x0000000000000018
+global-symbols:
+ - name: _a1
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
+ - name: _a2
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000014
+undefined-symbols:
+ - name: _t1
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
+ - name: _t2
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
--- /dev/null
+--- !mach-o
+arch: armv7
+file-type: MH_OBJECT
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ alignment: 2
+ address: 0x0000000000000000
+ content: [ 0x00, 0xBF, 0xFF, 0xF7, 0xFE, 0xEF, 0xFF, 0xF7,
+ 0xFB, 0xBF, 0x00, 0x00, 0x00, 0xF0, 0x20, 0xE3,
+ 0xFA, 0xFF, 0xFF, 0xFA, 0xF9, 0xFF, 0xFF, 0xEA ]
+ relocations:
+ - offset: 0x00000014
+ type: ARM_RELOC_BR24
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 3
+ - offset: 0x00000010
+ type: ARM_RELOC_BR24
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 3
+ - offset: 0x00000006
+ type: ARM_THUMB_RELOC_BR22
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 2
+ - offset: 0x00000002
+ type: ARM_THUMB_RELOC_BR22
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 2
+global-symbols:
+ - name: _a2
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x000000000000000C
+ - name: _t2
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ desc: [ N_ARM_THUMB_DEF ]
+ value: 0x0000000000000000
+undefined-symbols:
+ - name: _a1
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
+ - name: _t1
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_OBJECT
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID: false
+OS: unknown
+sections:
+ - segment: __TEXT
+ section: __objc_methname
+ type: S_CSTRING_LITERALS
+ attributes: [ ]
+ address: 0x0000000000000000
+ content: [ 0x61, 0x62, 0x63, 0x00 ]
+ - segment: __TEXT
+ section: __objc_classname
+ type: S_CSTRING_LITERALS
+ attributes: [ ]
+ address: 0x0000000000000006
+ content: [ 0x61, 0x62, 0x63, 0x00 ]
+ - segment: __TEXT
+ section: __cstring
+ type: S_CSTRING_LITERALS
+ attributes: [ ]
+ address: 0x000000000000000A
+ content: [ 0x61, 0x62, 0x63, 0x00 ]
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_OBJECT
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000000
+ content: [ 0x55, 0x48, 0x89, 0xE5, 0x48, 0x8B, 0x0D, 0x00,
+ 0x00, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00,
+ 0x00, 0x00, 0x8B, 0x00, 0x03, 0x01, 0x48, 0x8B,
+ 0x0D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x5D,
+ 0xC3 ]
+ relocations:
+ - offset: 0x00000019
+ type: X86_64_RELOC_GOT_LOAD
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 2
+ - offset: 0x0000000E
+ type: X86_64_RELOC_GOT_LOAD
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 1
+ - offset: 0x00000007
+ type: X86_64_RELOC_GOT_LOAD
+ length: 2
+ pc-rel: true
+ extern: true
+ symbol: 3
+global-symbols:
+ - name: _main
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
+undefined-symbols:
+ - name: _bar
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
+ - name: _foo
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
+ - name: _zazzle
+ type: N_UNDF
+ scope: [ N_EXT ]
+ value: 0x0000000000000000
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libfoobar.dylib
+exports:
+ - name: _bar
+ - name: _zazzle
+ - name: _foo
+ - name: _aaa
+ - name: _fff
+ - name: _zzz
--- /dev/null
+--- !mach-o
+arch: arm64
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: _fprintf
+ - name: ___stdoutp
+ - name: dyld_stub_binder
--- /dev/null
+--- !mach-o
+arch: armv6
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: _printf
+ - name: dyld_stub_binder
--- /dev/null
+--- !mach-o
+arch: armv7
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: _printf
+ - name: dyld_stub_binder
--- /dev/null
+--- !mach-o
+arch: x86
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: _printf
+ - name: dyld_stub_binder
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: _fprintf
+ - name: dyld_stub_binder
+ - name: ___stdoutp
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: _open
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libfoo.dylib
+compat-version: 2.0
+current-version: 3.4
+exports:
+ - name: _foo
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libbaz.dylib
+compat-version: 3.0
+current-version: 4.5
+exports:
+ - name: _baz
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libbar.dylib
+compat-version: 1.0
+current-version: 2.3
+exports:
+ - name: _bar
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+install-name: /usr/lib/libSystem.B.dylib
+exports:
+ - name: dyld_stub_binder
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+flags: [ MH_TWOLEVEL ]
+install-name: /junk/libfoo.dylib
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000F9A
+ content: [ 0x55, 0x48, 0x89, 0xE5, 0x5D, 0xC3 ]
+global-symbols:
+ - name: _foo
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000F9A
+dependents:
+ - path: /junk/libbar.dylib
+ kind: LC_REEXPORT_DYLIB
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+flags: [ MH_TWOLEVEL ]
+install-name: /junk/libbar.dylib
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000F9A
+ content: [ 0x55, 0x48, 0x89, 0xE5, 0x5D, 0xC3 ]
+global-symbols:
+ - name: _bar
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000F9A
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+flags: [ MH_TWOLEVEL ]
+install-name: /usr/lib/libSystem.B.dylib
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000000
+ content: [ 0x55 ]
+
+global-symbols:
+ - name: dyld_stub_binder
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
--- /dev/null
+--- !mach-o
+arch: arm64
+file-type: MH_DYLIB
+install-name: /usr/lib/libc++.dylib
+exports:
+ - name: __Unwind_Resume
+ - name: __ZTIl
+ - name: __ZTIi
+ - name: ___cxa_end_catch
+ - name: ___cxa_begin_catch
+ - name: ___cxa_allocate_exception
+ - name: ___cxa_throw
+ - name: ___gxx_personality_v0
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID: false
+OS: unknown
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ alignment: 4
+ address: 0x0000000000000000
+ content: [ 0xCC, 0xC3, 0x90, 0xC3, 0x90, 0x90, 0xC3, 0x90,
+ 0x90, 0x90, 0xC3, 0x90, 0x90, 0x90, 0x90, 0xC3,
+ 0x31, 0xC0, 0xC3 ]
+local-symbols:
+ - name: _myStatic
+ type: N_SECT
+ sect: 1
+ value: 0x000000000000000B
+ - name: _myVariablePreviouslyKnownAsPrivateExtern
+ type: N_SECT
+ scope: [ N_PEXT ]
+ sect: 1
+ desc: [ N_SYMBOL_RESOLVER ]
+ value: 0x0000000000000011
+global-symbols:
+ - name: _myGlobal
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000001
+ - name: _myGlobalWeak
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ desc: [ N_WEAK_DEF ]
+ value: 0x0000000000000002
+ - name: _myHidden
+ type: N_SECT
+ scope: [ N_EXT, N_PEXT ]
+ sect: 1
+ value: 0x0000000000000004
+ - name: _myHiddenWeak
+ type: N_SECT
+ scope: [ N_EXT, N_PEXT ]
+ sect: 1
+ desc: [ N_WEAK_DEF ]
+ value: 0x0000000000000007
+ - name: _myResolver
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ desc: [ N_SYMBOL_RESOLVER ]
+ value: 0x0000000000000010
+
+install-name: libspecial.dylib
--- /dev/null
+--- !mach-o
+arch: x86_64
+file-type: MH_DYLIB
+flags: [ ]
+install-name: /usr/lib/libSystem.B.dylib
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ address: 0x0000000000000000
+ content: [ 0x55 ]
+
+global-symbols:
+ - name: dyld_stub_binder
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
+
--- /dev/null
+# RUN: not lld -flavor darwin -arch x86_64 -r %s 2> %t.err
+# RUN: FileCheck %s < %t.err
+
+--- !mach-o
+arch: x86
+file-type: MH_OBJECT
+flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID: false
+OS: unknown
+sections:
+ - segment: __TEXT
+ section: __text
+ type: S_REGULAR
+ attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+ alignment: 4
+ address: 0x0000000000000000
+ content: [ 0xC3 ]
+
+global-symbols:
+ - name: _bar
+ type: N_SECT
+ scope: [ N_EXT ]
+ sect: 1
+ value: 0x0000000000000000
-# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t && \
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/PIE.yaml -o %t && \
# RUN: llvm-objdump -macho -private-headers %t | FileCheck %s
#
-# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -pie -o %t\
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/PIE.yaml -pie -o %t\
# RUN: && llvm-objdump -macho -private-headers %t | FileCheck %s
#
-# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -no_pie -o %t\
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/PIE.yaml -no_pie -o %t\
# RUN: && llvm-objdump -macho -private-headers %t \
# RUN: | FileCheck --check-prefix=CHECK_NO_PIE %s
#
sect: 1
value: 0x0000000000000000
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: dyld_stub_binder
-
...
# CHECK: MH_MAGIC_64 {{[0-9a-zA-Z _]+}} TWOLEVEL PIE
-# RUN: lld -flavor darwin -arch armv7 -r -print_atoms %s -o %t | FileCheck %s \
+# RUN: lld -flavor darwin -arch armv7 -r -print_atoms %s \
+# RUN: %p/Inputs/arm-interworking.yaml -o %t | FileCheck %s \
# RUN: && lld -flavor darwin -arch armv7 -dylib -print_atoms \
# RUN: %p/Inputs/libSystem.yaml %t -o %t2 | FileCheck %s \
# RUN: && macho-dump --dump-section-data %t2 | FileCheck -check-prefix=CODE %s
scope: [ N_EXT ]
value: 0x0000000000000000
---- !mach-o
-arch: armv7
-file-type: MH_OBJECT
-flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- alignment: 2
- address: 0x0000000000000000
- content: [ 0xFE, 0xFF, 0xFF, 0xEB, 0x02, 0x00, 0x00, 0xFA,
- 0xFC, 0xFF, 0xFF, 0xEB, 0xFB, 0xFF, 0xFF, 0xFA,
- 0x1E, 0xFF, 0x2F, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1 ]
- relocations:
- - offset: 0x0000000C
- type: ARM_RELOC_BR24
- length: 2
- pc-rel: true
- extern: true
- symbol: 4
- - offset: 0x00000008
- type: ARM_RELOC_BR24
- length: 2
- pc-rel: true
- extern: true
- symbol: 3
- - offset: 0x00000004
- type: ARM_RELOC_BR24
- length: 2
- pc-rel: true
- extern: false
- symbol: 1
- - offset: 0x00000000
- type: ARM_RELOC_BR24
- length: 2
- pc-rel: true
- extern: false
- symbol: 1
- - segment: __DATA
- section: __data
- type: S_REGULAR
- attributes: [ ]
- address: 0x0000000000000018
- content: [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ]
- relocations:
- - offset: 0x00000004
- type: ARM_RELOC_VANILLA
- length: 2
- pc-rel: false
- extern: false
- symbol: 1
- - offset: 0x00000000
- type: ARM_RELOC_VANILLA
- length: 2
- pc-rel: false
- extern: true
- symbol: 3
-local-symbols:
- - name: _d2
- type: N_SECT
- sect: 2
- value: 0x0000000000000018
-global-symbols:
- - name: _a1
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000000
- - name: _a2
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000014
-undefined-symbols:
- - name: _t1
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
- - name: _t2
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
...
-# RUN: lld -flavor darwin -arch armv7 %s -dylib %p/Inputs/libSystem.yaml -o %t
+# RUN: lld -flavor darwin -arch armv7 %s %p/Inputs/arm-shims.yaml \
+# RUN: -dylib %p/Inputs/libSystem.yaml -o %t
# RUN: macho-dump --dump-section-data %t | FileCheck %s
#
# Test b from arm to thumb or vice versa has shims added.s
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: armv7
-file-type: MH_OBJECT
-flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- alignment: 2
- address: 0x0000000000000000
- content: [ 0x00, 0xBF, 0xFF, 0xF7, 0xFE, 0xEF, 0xFF, 0xF7,
- 0xFB, 0xBF, 0x00, 0x00, 0x00, 0xF0, 0x20, 0xE3,
- 0xFA, 0xFF, 0xFF, 0xFA, 0xF9, 0xFF, 0xFF, 0xEA ]
- relocations:
- - offset: 0x00000014
- type: ARM_RELOC_BR24
- length: 2
- pc-rel: true
- extern: true
- symbol: 3
- - offset: 0x00000010
- type: ARM_RELOC_BR24
- length: 2
- pc-rel: true
- extern: true
- symbol: 3
- - offset: 0x00000006
- type: ARM_THUMB_RELOC_BR22
- length: 2
- pc-rel: true
- extern: true
- symbol: 2
- - offset: 0x00000002
- type: ARM_THUMB_RELOC_BR22
- length: 2
- pc-rel: true
- extern: true
- symbol: 2
-global-symbols:
- - name: _a2
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x000000000000000C
- - name: _t2
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- desc: [ N_ARM_THUMB_DEF ]
- value: 0x0000000000000000
-undefined-symbols:
- - name: _a1
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
- - name: _t1
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
-
...
address: 0x000000000000000A
content: [ 0x61, 0x62, 0x63, 0x00, 0x6A, 0x6B, 0x6C, 0x00 ]
---- !mach-o
-arch: x86_64
-file-type: MH_OBJECT
-flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
-has-UUID: false
-OS: unknown
-sections:
- - segment: __TEXT
- section: __objc_methname
- type: S_CSTRING_LITERALS
- attributes: [ ]
- address: 0x0000000000000000
- content: [ 0x61, 0x62, 0x63, 0x00 ]
- - segment: __TEXT
- section: __objc_classname
- type: S_CSTRING_LITERALS
- attributes: [ ]
- address: 0x0000000000000006
- content: [ 0x61, 0x62, 0x63, 0x00 ]
- - segment: __TEXT
- section: __cstring
- type: S_CSTRING_LITERALS
- attributes: [ ]
- address: 0x000000000000000A
- content: [ 0x61, 0x62, 0x63, 0x00 ]
-
...
-# RUN: lld -flavor darwin -arch x86_64 %s -o %t %p/Inputs/libSystem.yaml
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/got-order.yaml \
+# RUN: %p/Inputs/got-order2.yaml -o %t %p/Inputs/libSystem.yaml
# RUN: llvm-objdump -bind %t | FileCheck %s
#
# Test that GOT slots are sorted by name
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: x86_64
-file-type: MH_OBJECT
-flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- address: 0x0000000000000000
- content: [ 0x55, 0x48, 0x89, 0xE5, 0x48, 0x8B, 0x0D, 0x00,
- 0x00, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00,
- 0x00, 0x00, 0x8B, 0x00, 0x03, 0x01, 0x48, 0x8B,
- 0x0D, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x5D,
- 0xC3 ]
- relocations:
- - offset: 0x00000019
- type: X86_64_RELOC_GOT_LOAD
- length: 2
- pc-rel: true
- extern: true
- symbol: 2
- - offset: 0x0000000E
- type: X86_64_RELOC_GOT_LOAD
- length: 2
- pc-rel: true
- extern: true
- symbol: 1
- - offset: 0x00000007
- type: X86_64_RELOC_GOT_LOAD
- length: 2
- pc-rel: true
- extern: true
- symbol: 3
-global-symbols:
- - name: _main
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000000
-undefined-symbols:
- - name: _bar
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
- - name: _foo
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
- - name: _zazzle
- type: N_UNDF
- scope: [ N_EXT ]
- value: 0x0000000000000000
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libfoobar.dylib
-exports:
- - name: _bar
- - name: _zazzle
- - name: _foo
- - name: _aaa
- - name: _fff
- - name: _zzz
...
-# RUN: lld -flavor darwin -arch arm64 %s -o %t
+# RUN: lld -flavor darwin -arch arm64 %s %p/Inputs/hello-world-arm64.yaml -o %t
# RUN: llvm-nm -m -n %t | FileCheck %s
#
# Test that arm64 hello-world can be linked into a mach-o executable
value: 0x0000000000000000
...
---- !mach-o
-arch: arm64
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: _fprintf
- - name: ___stdoutp
- - name: dyld_stub_binder
-...
-
# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _main
# CHECK: (undefined) external ___stdoutp (from libSystem)
# CHECK: (undefined) external _fprintf (from libSystem)
-# RUN: lld -flavor darwin -arch armv6 %s -o %t
+# RUN: lld -flavor darwin -arch armv6 %s %p/Inputs/hello-world-armv6.yaml -o %t
# RUN: llvm-nm -m %t | FileCheck %s
#
# Test that armv6 (arm) hello-world can be linked into a mach-o executable
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: armv6
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: _printf
- - name: dyld_stub_binder
...
# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _main
-# RUN: lld -flavor darwin -arch armv7 %s -o %t
+# RUN: lld -flavor darwin -arch armv7 %s %p/Inputs/hello-world-armv7.yaml -o %t
# RUN: llvm-nm -m -n %t | FileCheck %s
#
# Test that armv7 (thumb) hello-world can be linked into a mach-o executable
value: 0x0000000000000000
...
---- !mach-o
-arch: armv7
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: _printf
- - name: dyld_stub_binder
-...
-
# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external [Thumb] _main
# CHECK: (undefined) external _printf (from libSystem)
# CHECK: (undefined) external dyld_stub_binder (from libSystem)
-# RUN: lld -flavor darwin -arch i386 %s -o %t
+# RUN: lld -flavor darwin -arch i386 %s %p/Inputs/hello-world-x86.yaml -o %t
# RUN: llvm-nm -m %t | FileCheck %s
#
# Test that i386 hello-world can be linked into a mach-o executable
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: x86
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: _printf
- - name: dyld_stub_binder
-
...
# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _main
-# RUN: lld -flavor darwin -arch x86_64 %s -o %t
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/hello-world-x86_64.yaml \
+# RUN: -o %t
# RUN: llvm-nm -m -n %t | FileCheck %s
#
-# RUN: lld -flavor darwin -arch x86_64 %s -dead_strip -o %t2
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/hello-world-x86_64.yaml \
+# RUN: -dead_strip -o %t2
# RUN: llvm-nm -m -n %t2 | FileCheck %s
#
# Test that x86_64 hello-world can be linked into a mach-o executable
scope: [ N_EXT ]
value: 0x0000000000000000
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: _fprintf
- - name: dyld_stub_binder
- - name: ___stdoutp
-
...
# CHECK: {{[0-9a-f]+}} (__TEXT,__text) external _main
-# RUN: lld -flavor darwin -arch x86_64 %s -dylib -o %t %p/Inputs/libSystem.yaml
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/interposing-section.yaml \
+# RUN: -dylib -o %t %p/Inputs/libSystem.yaml
# RUN: llvm-objdump -private-headers %t | FileCheck %s
#
# RUN: lld -flavor darwin -arch x86_64 %s -r -o %t1
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: _open
-
...
# REQUIRES: x86
-# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -o %t \
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/lazy-bind-x86_64.yaml %p/Inputs/lazy-bind-x86_64-2.yaml \
+# RUN: %p/Inputs/lazy-bind-x86_64-3.yaml -o %t \
# RUN: %p/Inputs/libSystem.yaml
# RUN: llvm-objdump -lazy-bind %t | FileCheck %s
# RUN: llvm-nm -m %t | FileCheck --check-prefix=CHECK-NM %s
scope: [ N_EXT ]
value: 0x0000000000000000
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libbar.dylib
-compat-version: 1.0
-current-version: 2.3
-exports:
- - name: _bar
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libfoo.dylib
-compat-version: 2.0
-current-version: 3.4
-exports:
- - name: _foo
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libbaz.dylib
-compat-version: 3.0
-current-version: 4.5
-exports:
- - name: _baz
-
...
# REQUIRES: system-linker-mach-o
#
# RUN: mkdir -p %t.dir && cp `which lld` %t.dir/ld \
-# RUN: && %t.dir/ld -arch x86_64 -macosx_version_min 10.8 %s -o %t \
+# RUN: && %t.dir/ld -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/linker-as-ld.yaml -o %t \
# RUN: && llvm-nm %t | FileCheck %s
#
# Test linker run as "ld" on darwin works as darwin linker.
scope: [ N_EXT ]
sect: 1
value: 0x0000000000000000
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-install-name: /usr/lib/libSystem.B.dylib
-exports:
- - name: dyld_stub_binder
-
...
# CHECK: T _main
-# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s -dylib -o %t \
+# RUN: lld -flavor darwin -arch x86_64 -macosx_version_min 10.8 %s \
+# RUN: %p/Inputs/re-exported-dylib-ordinal.yaml \
+# RUN: %p/Inputs/re-exported-dylib-ordinal2.yaml \
+# RUN: %p/Inputs/re-exported-dylib-ordinal3.yaml -dylib -o %t \
# RUN: && llvm-nm -m %t | FileCheck %s
#
# Test that when one dylib A re-exports dylib B that using a symbol from B
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-flags: [ MH_TWOLEVEL ]
-install-name: /junk/libfoo.dylib
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- address: 0x0000000000000F9A
- content: [ 0x55, 0x48, 0x89, 0xE5, 0x5D, 0xC3 ]
-global-symbols:
- - name: _foo
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000F9A
-dependents:
- - path: /junk/libbar.dylib
- kind: LC_REEXPORT_DYLIB
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-flags: [ MH_TWOLEVEL ]
-install-name: /junk/libbar.dylib
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- address: 0x0000000000000F9A
- content: [ 0x55, 0x48, 0x89, 0xE5, 0x5D, 0xC3 ]
-global-symbols:
- - name: _bar
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000F9A
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-flags: [ MH_TWOLEVEL ]
-install-name: /usr/lib/libSystem.B.dylib
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- address: 0x0000000000000000
- content: [ 0x55 ]
-
-global-symbols:
- - name: dyld_stub_binder
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000000
-
...
# CHECK: (undefined) external _bar (from libfoo)
-# RUN: lld -flavor darwin -arch arm64 %s -o %t -e _main %p/Inputs/libSystem.yaml
+# RUN: lld -flavor darwin -arch arm64 -o %t %s \
+# RUN: %p/Inputs/unwind-info-simple-arm64.yaml -e _main %p/Inputs/libSystem.yaml
# RUN: llvm-objdump -unwind-info %t | FileCheck %s
--- !mach-o
scope: [ N_EXT ]
value: 0x0000000000000000
---- !mach-o
-arch: arm64
-file-type: MH_DYLIB
-install-name: /usr/lib/libc++.dylib
-exports:
- - name: __Unwind_Resume
- - name: __ZTIl
- - name: __ZTIi
- - name: ___cxa_end_catch
- - name: ___cxa_begin_catch
- - name: ___cxa_allocate_exception
- - name: ___cxa_throw
- - name: ___gxx_personality_v0
-
...
-# RUN: lld -flavor darwin -arch x86_64 -print_atoms -r %s -o %t | FileCheck %s
+# RUN: lld -flavor darwin -arch x86_64 -print_atoms -r %s \
+# RUN: %p/Inputs/use-simple-dylib.yaml -o %t | FileCheck %s
--- !mach-o
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
-has-UUID: false
-OS: unknown
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- alignment: 4
- address: 0x0000000000000000
- content: [ 0xCC, 0xC3, 0x90, 0xC3, 0x90, 0x90, 0xC3, 0x90,
- 0x90, 0x90, 0xC3, 0x90, 0x90, 0x90, 0x90, 0xC3,
- 0x31, 0xC0, 0xC3 ]
-local-symbols:
- - name: _myStatic
- type: N_SECT
- sect: 1
- value: 0x000000000000000B
- - name: _myVariablePreviouslyKnownAsPrivateExtern
- type: N_SECT
- scope: [ N_PEXT ]
- sect: 1
- desc: [ N_SYMBOL_RESOLVER ]
- value: 0x0000000000000011
-global-symbols:
- - name: _myGlobal
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000001
- - name: _myGlobalWeak
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- desc: [ N_WEAK_DEF ]
- value: 0x0000000000000002
- - name: _myHidden
- type: N_SECT
- scope: [ N_EXT, N_PEXT ]
- sect: 1
- value: 0x0000000000000004
- - name: _myHiddenWeak
- type: N_SECT
- scope: [ N_EXT, N_PEXT ]
- sect: 1
- desc: [ N_WEAK_DEF ]
- value: 0x0000000000000007
- - name: _myResolver
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- desc: [ N_SYMBOL_RESOLVER ]
- value: 0x0000000000000010
-
-install-name: libspecial.dylib
...
-# RUN: lld -flavor darwin -arch x86_64 %s -o %t -e _foo
+# RUN: lld -flavor darwin -arch x86_64 %s %p/Inputs/write-final-sections.yaml \
+# RUN: -o %t -e _foo
# RUN: llvm-readobj -sections -section-data %t | FileCheck %s
--- !native
- type: compact-unwind
content: [ 0E, 00, 00, 00, 00, 00, 00, 00 ]
# CHECK-NOT: Name: __compact_unwind
-
-
---- !mach-o
-arch: x86_64
-file-type: MH_DYLIB
-flags: [ ]
-install-name: /usr/lib/libSystem.B.dylib
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- address: 0x0000000000000000
- content: [ 0x55 ]
-
-global-symbols:
- - name: dyld_stub_binder
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000000
-
-# RUN: not lld -flavor darwin -arch x86_64 -r %s 2> %t.err
+# RUN: not lld -flavor darwin -arch x86_64 -r %s \
+# RUN: %p/Inputs/wrong-arch-error.yaml 2> %t.err
# RUN: FileCheck %s < %t.err
--- !mach-o
scope: [ N_EXT ]
sect: 1
value: 0x0000000000000000
-
---- !mach-o
-arch: x86
-file-type: MH_OBJECT
-flags: [ MH_SUBSECTIONS_VIA_SYMBOLS ]
-has-UUID: false
-OS: unknown
-sections:
- - segment: __TEXT
- section: __text
- type: S_REGULAR
- attributes: [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
- alignment: 4
- address: 0x0000000000000000
- content: [ 0xC3 ]
-
-global-symbols:
- - name: _bar
- type: N_SECT
- scope: [ N_EXT ]
- sect: 1
- value: 0x0000000000000000
...