blob: 2fb4df3612f4b06a4dd7c85e36aa773b6373e47a [file] [log] [blame]
Rui Ueyama9f56df82013-06-11 23:07:43 +00001//===- lld/unittest/DarwinLdDriverTest.cpp --------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
11/// \brief Darwin's ld driver tests.
12///
13//===----------------------------------------------------------------------===//
14
15#include "DriverTest.h"
16
Rui Ueyama0ca149f2013-08-06 22:31:59 +000017#include "lld/ReaderWriter/MachOLinkingContext.h"
Shankar Easwarane44104b2013-08-21 22:57:10 +000018#include "lld/ReaderWriter/MachOFormat.hpp"
Rui Ueyama9f56df82013-06-11 23:07:43 +000019
20using namespace llvm;
21using namespace lld;
22
23namespace {
24
Rui Ueyama0ca149f2013-08-06 22:31:59 +000025class DarwinLdParserTest
26 : public ParserTest<DarwinLdDriver, MachOLinkingContext> {
Rui Ueyama9f56df82013-06-11 23:07:43 +000027protected:
Rui Ueyama0ca149f2013-08-06 22:31:59 +000028 virtual const LinkingContext *linkingContext() { return &_context; }
Rui Ueyama9f56df82013-06-11 23:07:43 +000029};
30
31TEST_F(DarwinLdParserTest, Basic) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000032 EXPECT_FALSE(parse("ld", "foo.o", "bar.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000033 EXPECT_FALSE(_context.allowRemainingUndefines());
34 EXPECT_FALSE(_context.deadStrip());
Nick Kledzik2a709ea2013-07-16 18:45:57 +000035 EXPECT_EQ(2, inputFileCount());
36 EXPECT_EQ("foo.o", inputFile(0));
37 EXPECT_EQ("bar.o", inputFile(1));
Rui Ueyama9f56df82013-06-11 23:07:43 +000038}
39
Nick Kledzika1210532013-07-18 23:13:13 +000040TEST_F(DarwinLdParserTest, Output) {
Nick Kledzika20a4032013-07-18 23:47:22 +000041 EXPECT_FALSE(parse("ld", "-o", "my.out", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000042 EXPECT_EQ("my.out", _context.outputPath());
Nick Kledzika1210532013-07-18 23:13:13 +000043}
44
Rui Ueyama9f56df82013-06-11 23:07:43 +000045TEST_F(DarwinLdParserTest, Dylib) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000046 EXPECT_FALSE(parse("ld", "-dylib", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000047 EXPECT_EQ(mach_o::MH_DYLIB, _context.outputFileType());
Rui Ueyama9f56df82013-06-11 23:07:43 +000048}
49
50TEST_F(DarwinLdParserTest, Relocatable) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000051 EXPECT_FALSE(parse("ld", "-r", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000052 EXPECT_EQ(mach_o::MH_OBJECT, _context.outputFileType());
Rui Ueyama9f56df82013-06-11 23:07:43 +000053}
54
55TEST_F(DarwinLdParserTest, Bundle) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000056 EXPECT_FALSE(parse("ld", "-bundle", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000057 EXPECT_EQ(mach_o::MH_BUNDLE, _context.outputFileType());
Rui Ueyama9f56df82013-06-11 23:07:43 +000058}
59
60TEST_F(DarwinLdParserTest, Preload) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000061 EXPECT_FALSE(parse("ld", "-preload", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000062 EXPECT_EQ(mach_o::MH_PRELOAD, _context.outputFileType());
Rui Ueyama9f56df82013-06-11 23:07:43 +000063}
64
65TEST_F(DarwinLdParserTest, Static) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000066 EXPECT_FALSE(parse("ld", "-static", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000067 EXPECT_EQ(mach_o::MH_EXECUTE, _context.outputFileType());
Rui Ueyama9f56df82013-06-11 23:07:43 +000068}
69
70TEST_F(DarwinLdParserTest, Entry) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000071 EXPECT_FALSE(parse("ld", "-e", "entryFunc", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000072 EXPECT_EQ("entryFunc", _context.entrySymbolName());
Rui Ueyama9f56df82013-06-11 23:07:43 +000073}
74
75TEST_F(DarwinLdParserTest, OutputPath) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000076 EXPECT_FALSE(parse("ld", "-o", "foo", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000077 EXPECT_EQ("foo", _context.outputPath());
Rui Ueyama9f56df82013-06-11 23:07:43 +000078}
79
80TEST_F(DarwinLdParserTest, DeadStrip) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +000081 EXPECT_FALSE(parse("ld", "-dead_strip", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000082 EXPECT_TRUE(_context.deadStrip());
Rui Ueyama9f56df82013-06-11 23:07:43 +000083}
84
Nick Kledzika1210532013-07-18 23:13:13 +000085TEST_F(DarwinLdParserTest, DeadStripRootsExe) {
Nick Kledzika20a4032013-07-18 23:47:22 +000086 EXPECT_FALSE(parse("ld", "-dead_strip", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000087 EXPECT_FALSE(_context.globalsAreDeadStripRoots());
Nick Kledzika1210532013-07-18 23:13:13 +000088}
89
90TEST_F(DarwinLdParserTest, DeadStripRootsDylib) {
Nick Kledzika20a4032013-07-18 23:47:22 +000091 EXPECT_FALSE(parse("ld", "-dylib", "-dead_strip", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000092 EXPECT_TRUE(_context.globalsAreDeadStripRoots());
Nick Kledzika1210532013-07-18 23:13:13 +000093}
94
95TEST_F(DarwinLdParserTest, ForceLoadArchive) {
Nick Kledzika20a4032013-07-18 23:47:22 +000096 EXPECT_FALSE(parse("ld","-all_load", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +000097 EXPECT_TRUE(_context.forceLoadAllArchives());
Nick Kledzika1210532013-07-18 23:13:13 +000098}
99
100TEST_F(DarwinLdParserTest, NoForceLoadArchive) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000101 EXPECT_FALSE(parse("ld", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000102 EXPECT_FALSE(_context.forceLoadAllArchives());
Nick Kledzika1210532013-07-18 23:13:13 +0000103}
104
Rui Ueyama9f56df82013-06-11 23:07:43 +0000105TEST_F(DarwinLdParserTest, Arch) {
Nick Kledzik2a709ea2013-07-16 18:45:57 +0000106 EXPECT_FALSE(parse("ld", "-arch", "x86_64", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000107 EXPECT_EQ(MachOLinkingContext::arch_x86_64, _context.arch());
108 EXPECT_EQ(mach_o::CPU_TYPE_X86_64, _context.getCPUType());
109 EXPECT_EQ(mach_o::CPU_SUBTYPE_X86_64_ALL, _context.getCPUSubType());
Rui Ueyama9f56df82013-06-11 23:07:43 +0000110}
111
Nick Kledzika1210532013-07-18 23:13:13 +0000112TEST_F(DarwinLdParserTest, Arch_x86) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000113 EXPECT_FALSE(parse("ld", "-arch", "i386", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000114 EXPECT_EQ(MachOLinkingContext::arch_x86, _context.arch());
115 EXPECT_EQ(mach_o::CPU_TYPE_I386, _context.getCPUType());
116 EXPECT_EQ(mach_o::CPU_SUBTYPE_X86_ALL, _context.getCPUSubType());
Nick Kledzika1210532013-07-18 23:13:13 +0000117}
118
119TEST_F(DarwinLdParserTest, Arch_armv6) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000120 EXPECT_FALSE(parse("ld", "-arch", "armv6", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000121 EXPECT_EQ(MachOLinkingContext::arch_armv6, _context.arch());
122 EXPECT_EQ(mach_o::CPU_TYPE_ARM, _context.getCPUType());
123 EXPECT_EQ(mach_o::CPU_SUBTYPE_ARM_V6, _context.getCPUSubType());
Nick Kledzika1210532013-07-18 23:13:13 +0000124}
125
126TEST_F(DarwinLdParserTest, Arch_armv7) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000127 EXPECT_FALSE(parse("ld", "-arch", "armv7", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000128 EXPECT_EQ(MachOLinkingContext::arch_armv7, _context.arch());
129 EXPECT_EQ(mach_o::CPU_TYPE_ARM, _context.getCPUType());
130 EXPECT_EQ(mach_o::CPU_SUBTYPE_ARM_V7, _context.getCPUSubType());
Nick Kledzika1210532013-07-18 23:13:13 +0000131}
132
133TEST_F(DarwinLdParserTest, Arch_armv7s) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000134 EXPECT_FALSE(parse("ld", "-arch", "armv7s", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000135 EXPECT_EQ(MachOLinkingContext::arch_armv7s, _context.arch());
136 EXPECT_EQ(mach_o::CPU_TYPE_ARM, _context.getCPUType());
137 EXPECT_EQ(mach_o::CPU_SUBTYPE_ARM_V7S, _context.getCPUSubType());
Nick Kledzika1210532013-07-18 23:13:13 +0000138}
139
140TEST_F(DarwinLdParserTest, MinMacOSX10_7) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000141 EXPECT_FALSE(parse("ld", "-macosx_version_min", "10.7", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000142 EXPECT_EQ(MachOLinkingContext::OS::macOSX, _context.os());
143 EXPECT_TRUE(_context.minOS("10.7", ""));
144 EXPECT_FALSE(_context.minOS("10.8", ""));
Nick Kledzika1210532013-07-18 23:13:13 +0000145}
146
147TEST_F(DarwinLdParserTest, MinMacOSX10_8) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000148 EXPECT_FALSE(parse("ld", "-macosx_version_min", "10.8.3", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000149 EXPECT_EQ(MachOLinkingContext::OS::macOSX, _context.os());
150 EXPECT_TRUE(_context.minOS("10.7", ""));
151 EXPECT_TRUE(_context.minOS("10.8", ""));
Nick Kledzika1210532013-07-18 23:13:13 +0000152}
153
154TEST_F(DarwinLdParserTest, iOS5) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000155 EXPECT_FALSE(parse("ld", "-ios_version_min", "5.0", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000156 EXPECT_EQ(MachOLinkingContext::OS::iOS, _context.os());
157 EXPECT_TRUE(_context.minOS("", "5.0"));
158 EXPECT_FALSE(_context.minOS("", "6.0"));
Nick Kledzika1210532013-07-18 23:13:13 +0000159}
160
161TEST_F(DarwinLdParserTest, iOS6) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000162 EXPECT_FALSE(parse("ld", "-ios_version_min", "6.0", "foo.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000163 EXPECT_EQ(MachOLinkingContext::OS::iOS, _context.os());
164 EXPECT_TRUE(_context.minOS("", "5.0"));
165 EXPECT_TRUE(_context.minOS("", "6.0"));
Nick Kledzika1210532013-07-18 23:13:13 +0000166}
167
168TEST_F(DarwinLdParserTest, iOS_Simulator5) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000169 EXPECT_FALSE(parse("ld", "-ios_simulator_version_min", "5.0", "a.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000170 EXPECT_EQ(MachOLinkingContext::OS::iOS_simulator, _context.os());
171 EXPECT_TRUE(_context.minOS("", "5.0"));
172 EXPECT_FALSE(_context.minOS("", "6.0"));
Nick Kledzika1210532013-07-18 23:13:13 +0000173}
174
175TEST_F(DarwinLdParserTest, iOS_Simulator6) {
Nick Kledzika20a4032013-07-18 23:47:22 +0000176 EXPECT_FALSE(parse("ld", "-ios_simulator_version_min", "6.0", "a.o", nullptr));
Rui Ueyama0ca149f2013-08-06 22:31:59 +0000177 EXPECT_EQ(MachOLinkingContext::OS::iOS_simulator, _context.os());
178 EXPECT_TRUE(_context.minOS("", "5.0"));
179 EXPECT_TRUE(_context.minOS("", "6.0"));
Nick Kledzika1210532013-07-18 23:13:13 +0000180}
181
Rui Ueyama9f56df82013-06-11 23:07:43 +0000182} // end anonymous namespace