From 7f09b9353af9897bf18933788d6a59c152c29edd Mon Sep 17 00:00:00 2001 From: Apple Date: Fri, 20 Jan 2017 22:24:10 +0000 Subject: [PATCH 1/1] ld64-274.2.tar.gz --- src/ld/parsers/lto_file.cpp | 8 +-- .../test-cases/dwarf-debug-notes-lto/Makefile | 54 +++++++++++++++++++ .../test-cases/dwarf-debug-notes-lto/header.h | 8 +++ .../dwarf-debug-notes-lto/hello.cxx | 33 ++++++++++++ .../dwarf-debug-notes-lto/other.cxx | 27 ++++++++++ 5 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 unit-tests/test-cases/dwarf-debug-notes-lto/Makefile create mode 100644 unit-tests/test-cases/dwarf-debug-notes-lto/header.h create mode 100644 unit-tests/test-cases/dwarf-debug-notes-lto/hello.cxx create mode 100644 unit-tests/test-cases/dwarf-debug-notes-lto/other.cxx diff --git a/src/ld/parsers/lto_file.cpp b/src/ld/parsers/lto_file.cpp index a5ab821..650fd4e 100644 --- a/src/ld/parsers/lto_file.cpp +++ b/src/ld/parsers/lto_file.cpp @@ -1307,10 +1307,6 @@ bool Parser::optimizeThinLTO(const std::vector& files, // mach-o parsing is done in-memory, but need path for debug notes std::string tmp_path = macho_dirpath + "/" + std::to_string(bufID) + ".o"; - // parse generated mach-o file into a MachOReader - ld::relocatable::File* machoFile = parseMachOFile((const uint8_t *)machOFile.Buffer, machOFile.Size, tmp_path, options, ordinal); - ordinal = ordinal.nextFileListOrdinal(); - // if needed, save temp mach-o file to specific location if ( options.tmpObjectFilePath != NULL ) { int fd = ::open(tmp_path.c_str(), O_CREAT | O_WRONLY | O_TRUNC, 0666); @@ -1323,6 +1319,10 @@ bool Parser::optimizeThinLTO(const std::vector& files, } } + // parse generated mach-o file into a MachOReader + ld::relocatable::File* machoFile = parseMachOFile((const uint8_t *)machOFile.Buffer, machOFile.Size, tmp_path, options, ordinal); + ordinal = ordinal.nextFileListOrdinal(); + // Load the generated MachO file loadMachO(machoFile, options, handler, newAtoms, additionalUndefines, llvmAtoms, deadllvmAtoms); } diff --git a/unit-tests/test-cases/dwarf-debug-notes-lto/Makefile b/unit-tests/test-cases/dwarf-debug-notes-lto/Makefile new file mode 100644 index 0000000..b498430 --- /dev/null +++ b/unit-tests/test-cases/dwarf-debug-notes-lto/Makefile @@ -0,0 +1,54 @@ +## +# Copyright (c) 2005-2010 Apple Inc. All rights reserved. +# +# @APPLE_LICENSE_HEADER_START@ +# +# This file contains Original Code and/or Modifications of Original Code +# as defined in and that are subject to the Apple Public Source License +# Version 2.0 (the 'License'). You may not use this file except in +# compliance with the License. Please obtain a copy of the License at +# http://www.opensource.apple.com/apsl/ and read it before using this +# file. +# +# The Original Code and all software distributed under the License are +# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER +# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, +# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. +# Please see the License for the specific language governing rights and +# limitations under the License. +# +# @APPLE_LICENSE_HEADER_END@ +## +TESTROOT = ../.. +include ${TESTROOT}/include/common.makefile + +# +# The point of this test is a sanity check that ld +# produces good "debug notes" stabs from dwarf .o files +# Running nm through stabs-filter.pl produces connonical stabs +# that can be diffed against a checked in know good set of stabs +# + +run: all + +all: + ${CXX} ${CCXXFLAGS} -flto -gdwarf-2 hello.cxx -c -o hello.o + ${CXX} ${CCXXFLAGS} -flto -gdwarf-2 other.cxx -c -o other.o + ${CXX} ${CCXXFLAGS} -flto -gdwarf-2 hello.o other.o -o hello -Wl,-object_path_lto,lto.o + ${FAIL_IF_BAD_MACHO} hello + # Check that we have a non zero timestamp in the debug note + nm -ap hello | grep '^[0-9a-z]*[1-9a-z][0-9a-z]* .*OSO.*lto.o$$' | ${FAIL_IF_EMPTY} + + # Same for Incremental LTO now + ${CXX} ${CCXXFLAGS} -flto=thin -gdwarf-2 hello.cxx -c -o hello.o + ${CXX} ${CCXXFLAGS} -flto=thin -gdwarf-2 other.cxx -c -o other.o + ${CXX} ${CCXXFLAGS} -flto=thin -gdwarf-2 hello.o other.o -o hello.thin -Wl,-object_path_lto,thinlto.o + ${FAIL_IF_BAD_MACHO} hello.thin + # Check that we have a non zero timestamp in the debug note + nm -ap hello.thin | grep '^[0-9a-z]*[1-9a-z][0-9a-z]* .*OSO.*thinlto.o/0.o$$' | ${FAIL_IF_EMPTY} + nm -ap hello.thin | grep '^[0-9a-z]*[1-9a-z][0-9a-z]* .*OSO.*thinlto.o/1.o$$' | ${FAIL_IF_EMPTY} + + +clean: + rm -rf hello hello.thin hello.o other.o lto.o thinlto.o diff --git a/unit-tests/test-cases/dwarf-debug-notes-lto/header.h b/unit-tests/test-cases/dwarf-debug-notes-lto/header.h new file mode 100644 index 0000000..aa960dd --- /dev/null +++ b/unit-tests/test-cases/dwarf-debug-notes-lto/header.h @@ -0,0 +1,8 @@ + + +inline int foo(int x) +{ + return x + 10; +} + +extern int bar(int x); \ No newline at end of file diff --git a/unit-tests/test-cases/dwarf-debug-notes-lto/hello.cxx b/unit-tests/test-cases/dwarf-debug-notes-lto/hello.cxx new file mode 100644 index 0000000..0d508e1 --- /dev/null +++ b/unit-tests/test-cases/dwarf-debug-notes-lto/hello.cxx @@ -0,0 +1,33 @@ +/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*- + * + * Copyright (c) 2005 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this + * file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ +#include + +#include "header.h" + + +int main() +{ + foo(bar(3)); + fprintf(stdout, "hello\n"); +} \ No newline at end of file diff --git a/unit-tests/test-cases/dwarf-debug-notes-lto/other.cxx b/unit-tests/test-cases/dwarf-debug-notes-lto/other.cxx new file mode 100644 index 0000000..a6b403b --- /dev/null +++ b/unit-tests/test-cases/dwarf-debug-notes-lto/other.cxx @@ -0,0 +1,27 @@ + +#include "header.h" + +int uninit; +int init = 1; +static int custom __asm__(".my_non_standard_name") = 1; +static int suninit; +static int sinit=0; +static int scustominit __asm__(".my_non_standard_name_static") = 1; + +int bar(int x) +{ + static int bar_uninit; + static int bar_init=3; + bar_uninit = x; + scustominit = x; + custom = x; + return 20 + suninit + sinit + + bar_init + bar_uninit + foo(x); +} + +extern void disappear() __asm__("lbegone"); +void disappear() {} + +extern void foo() __asm__(".my_non_standard_function_name"); +void foo() { disappear(); } + -- 2.45.2