From 6186fa5fe9869c6102597b18244fc9546f931632 Mon Sep 17 00:00:00 2001 From: Googler Date: Tue, 13 Jun 2017 17:39:50 +0200 Subject: Add support for zipped LLVM profile files. This change is a follow-up to a recent change which allowed LLVM raw profile files to be directly used with blaze. This change allows zipped LLVM raw profile files. This uses //tools/zip:zipper to extract the zipped file contents. This also adds a new option to //tools/zip:zipper, 'j', to junk directories while unzipping. Tested: blaze test //devtools/blaze/integration:fdo_test blaze test //third_party/ijar/test:zip_test RELNOTES[NEW]: Zipped LLVM profiles are now supported. PiperOrigin-RevId: 158849516 --- third_party/ijar/test/zip_test.sh | 28 ++++++++++++++++++++++---- third_party/ijar/zip_main.cc | 42 ++++++++++++++++++++++++++------------- 2 files changed, 52 insertions(+), 18 deletions(-) (limited to 'third_party/ijar') diff --git a/third_party/ijar/test/zip_test.sh b/third_party/ijar/test/zip_test.sh index d206a74ee6..d70fa8fcb0 100755 --- a/third_party/ijar/test/zip_test.sh +++ b/third_party/ijar/test/zip_test.sh @@ -80,8 +80,8 @@ function test_zipper() { # Test flatten option (cd ${TEST_TMPDIR}/test && $ZIPPER cf ${TEST_TMPDIR}/output.zip ${filelist}) $ZIPPER v ${TEST_TMPDIR}/output.zip >$TEST_log - expect_log "file" - expect_log "other_file" + expect_log "^f .* file$" + expect_log "^f .* other_file$" expect_not_log "path" expect_not_log "/" @@ -90,11 +90,31 @@ function test_zipper() { echo "abcdefghi" >${TEST_TMPDIR}/test.zip cat ${TEST_TMPDIR}/output.zip >>${TEST_TMPDIR}/test.zip $ZIPPER v ${TEST_TMPDIR}/test.zip >$TEST_log - expect_log "file" - expect_log "other_file" + expect_log "^f .* file$" + expect_log "^f .* other_file$" expect_not_log "path" } +function test_zipper_junk_paths() { + mkdir -p ${TEST_TMPDIR}/test/path/to/some + mkdir -p ${TEST_TMPDIR}/test/some/other/path + touch ${TEST_TMPDIR}/test/path/to/some/empty_file + echo "toto" > ${TEST_TMPDIR}/test/path/to/some/file + echo "titi" > ${TEST_TMPDIR}/test/path/to/some/other_file + chmod +x ${TEST_TMPDIR}/test/path/to/some/other_file + echo "tata" > ${TEST_TMPDIR}/test/file + filelist="$(cd ${TEST_TMPDIR}/test && find . | sed 's|^./||' | grep -v '^.$')" + + # Test extract + flatten option + (cd ${TEST_TMPDIR}/test && $ZIPPER c ${TEST_TMPDIR}/output.zip ${filelist}) + $ZIPPER vf ${TEST_TMPDIR}/output.zip >$TEST_log + echo $TEST_log + expect_log "^f .* file$" + expect_log "^f .* other_file$" + expect_not_log "path" + expect_not_log "/" +} + function test_zipper_unzip_selective_files() { mkdir -p ${TEST_TMPDIR}/test/path/to/some mkdir -p ${TEST_TMPDIR}/test/some/other/path diff --git a/third_party/ijar/zip_main.cc b/third_party/ijar/zip_main.cc index 51aea54157..5639bc02a8 100644 --- a/third_party/ijar/zip_main.cc +++ b/third_party/ijar/zip_main.cc @@ -45,9 +45,11 @@ class UnzipProcessor : public ZipExtractorProcessor { // into output_root if "extract" is set to true and will print the list of // files and their unix modes if "verbose" is set to true. UnzipProcessor(const char *output_root, char **files, bool verbose, - bool extract) : output_root_(output_root), - verbose_(verbose), - extract_(extract) { + bool extract, bool flatten) + : output_root_(output_root), + verbose_(verbose), + extract_(extract), + flatten_(flatten) { if (files != NULL) { for (int i = 0; files[i] != NULL; i++) { file_names.insert(std::string(files[i])); @@ -73,6 +75,7 @@ class UnzipProcessor : public ZipExtractorProcessor { const char *output_root_; const bool verbose_; const bool extract_; + const bool flatten_; std::set file_names; }; @@ -98,17 +101,29 @@ void UnzipProcessor::Process(const char* filename, const u4 attr, const u1* data, const size_t size) { mode_t perm = zipattr_to_perm(attr); bool isdir = zipattr_is_dir(attr); + const char *output_file_name = filename; if (attr == 0) { // Fallback when the external attribute is not set. isdir = filename[strlen(filename)-1] == '/'; perm = 0777; } + + if (flatten_) { + if (isdir) { + return; + } + const char *p = strrchr(filename, '/'); + if (p != NULL) { + output_file_name = p + 1; + } + } + if (verbose_) { - printf("%c %o %s\n", isdir ? 'd' : 'f', perm, filename); + printf("%c %o %s\n", isdir ? 'd' : 'f', perm, output_file_name); } if (extract_) { char path[PATH_MAX]; - concat_path(path, PATH_MAX, output_root_, filename); + concat_path(path, PATH_MAX, output_root_, output_file_name); if (!make_dirs(path, perm) || (!isdir && !write_file(path, perm, data, size))) { abort(); @@ -130,8 +145,8 @@ void basename(const char *path, char *output, size_t output_size) { } // Execute the extraction (or just listing if just v is provided) -int extract(char *zipfile, char* exdir, char **files, bool verbose, - bool extract) { +int extract(char *zipfile, char *exdir, char **files, bool verbose, + bool extract, bool flatten) { std::string cwd = get_cwd(); if (cwd.empty()) { return -1; @@ -144,7 +159,7 @@ int extract(char *zipfile, char* exdir, char **files, bool verbose, strncpy(output_root, cwd.c_str(), PATH_MAX); } - UnzipProcessor processor(output_root, files, verbose, extract); + UnzipProcessor processor(output_root, files, verbose, extract, flatten); std::unique_ptr extractor(ZipExtractor::Create(zipfile, &processor)); if (extractor.get() == NULL) { @@ -346,7 +361,9 @@ static void usage(char *progname) { " an optional directory relative to the current directory " " specified through -d option\n"); fprintf(stderr, " c create - add files to x.zip\n"); - fprintf(stderr, " f flatten - flatten files to use with create operation\n"); + fprintf(stderr, + " f flatten - flatten files to use with create or " + "extract operation\n"); fprintf(stderr, " C compress - compress files when using the create operation\n"); fprintf(stderr, "x and c cannot be used in the same command-line.\n"); @@ -438,16 +455,13 @@ int main(int argc, char **argv) { // Create a zip return devtools_ijar::create(argv[2], filelist, flatten, verbose, compress); } else { - if (flatten) { - usage(argv[0]); - } - char* exdir = NULL; if (argc > 3 && strcmp(argv[3], "-d") == 0) { exdir = argv[4]; } // Extraction / list mode - return devtools_ijar::extract(argv[2], exdir, filelist, verbose, extract); + return devtools_ijar::extract(argv[2], exdir, filelist, verbose, extract, + flatten); } } -- cgit v1.2.3