Dead strip DESC bits should only be set on object files.
authorPete Cooper <peter_cooper@apple.com>
Thu, 11 Aug 2016 21:27:18 +0000 (21:27 +0000)
committerPete Cooper <peter_cooper@apple.com>
Thu, 11 Aug 2016 21:27:18 +0000 (21:27 +0000)
It only makes sense to set on N_NO_DEAD_STRIP on a relocatable object file.  Otherwise the bits aren't useful for anything.  Matches the ld64 behaviour.

llvm-svn: 278419

lld/lib/ReaderWriter/MachO/MachONormalizedFileFromAtoms.cpp
lld/test/mach-o/dead-strip-globals.yaml

index f315e2c..d8202c4 100644 (file)
@@ -963,7 +963,8 @@ uint16_t Util::descBits(const DefinedAtom* atom) {
     desc |= REFERENCED_DYNAMICALLY;
   if (_archHandler.isThumbFunction(*atom))
     desc |= N_ARM_THUMB_DEF;
-  if (atom->deadStrip() == DefinedAtom::deadStripNever) {
+  if (atom->deadStrip() == DefinedAtom::deadStripNever &&
+      _ctx.outputMachOType() == llvm::MachO::MH_OBJECT) {
     if ((atom->contentType() != DefinedAtom::typeInitializerPtr)
      && (atom->contentType() != DefinedAtom::typeTerminatorPtr))
     desc |= N_NO_DEAD_STRIP;
index 6cb8164..45d919d 100644 (file)
@@ -2,6 +2,9 @@
 # RUN: lld -flavor darwin -arch x86_64 -export_dynamic -dead_strip %s -dylib %p/Inputs/x86_64/libSystem.yaml -o %t.dylib -print_atoms | FileCheck -check-prefix=CHECK1 %s
 # RUN: lld -flavor darwin -arch x86_64 -dead_strip %s -dylib %p/Inputs/x86_64/libSystem.yaml -o %t2.dylib -print_atoms | FileCheck -check-prefix=CHECK2 %s
 
+# RUN: lld -flavor darwin -arch x86_64 -r %s -dylib %p/Inputs/x86_64/libSystem.yaml -o %t3.o
+# RUN: llvm-nm -m %t3.o | FileCheck -check-prefix=RELOCATABLE_SYMBOLS %s
+
 #
 # Test that -export_dynamic -dead-strip from removing globals.
 #
@@ -25,3 +28,4 @@ shared-library-atoms:
 # CHECK2:       name: def
 # CHECK2-NOT:   name: dead
 
+# RELOCATABLE_SYMBOLS: external def