Index: llvm/trunk/test/tools/llvm-objcopy/discard-all.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/discard-all.test +++ llvm/trunk/test/tools/llvm-objcopy/discard-all.test @@ -1,8 +1,23 @@ # RUN: yaml2obj %s > %t +# RUN: cp %t %t1 # RUN: llvm-objcopy --discard-all %t %t2 -# RUN: llvm-objcopy -x %t %t3 +# Verify that llvm-objcopy has not modified the input. +# RUN: cmp %t %t1 # RUN: llvm-readobj -symbols %t2 | FileCheck %s -# RUN: diff %t2 %t3 + +# RUN: llvm-objcopy -x %t %t3 +# Verify that llvm-objcopy has not modified the input. +# RUN: cmp %t %t1 +# RUN: cmp %t2 %t3 + +# Verify that llvm-strip modifies the symbol table the same way. + +# RUN: cp %t %t4 +# RUN: llvm-strip --discard-all %t4 +# RUN: cmp %t2 %t4 + +# RUN: llvm-strip -x %t +# RUN: cmp %t2 %t !ELF FileHeader: Index: llvm/trunk/tools/llvm-objcopy/StripOpts.td =================================================================== --- llvm/trunk/tools/llvm-objcopy/StripOpts.td +++ llvm/trunk/tools/llvm-objcopy/StripOpts.td @@ -36,3 +36,8 @@ def K : JoinedOrSeparate<["-"], "K">, Alias; + +def discard_all : Flag<["-", "--"], "discard-all">, + HelpText<"Remove all local symbols except file and section symbols">; +def x : Flag<["-"], "x">, + Alias; Index: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp +++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp @@ -585,7 +585,10 @@ // Strip debug info only. Config.StripDebug = InputArgs.hasArg(STRIP_strip_debug); - if (!Config.StripDebug) + + Config.DiscardAll = InputArgs.hasArg(STRIP_discard_all); + + if (!Config.StripDebug && !Config.DiscardAll) Config.StripAll = true; for (auto Arg : InputArgs.filtered(STRIP_remove_section))