summaryrefslogtreecommitdiff
path: root/compiler/debug/xz_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/debug/xz_utils.cc')
-rw-r--r--compiler/debug/xz_utils.cc134
1 files changed, 0 insertions, 134 deletions
diff --git a/compiler/debug/xz_utils.cc b/compiler/debug/xz_utils.cc
deleted file mode 100644
index 5b36209d2f..0000000000
--- a/compiler/debug/xz_utils.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xz_utils.h"
-
-#include <vector>
-#include <mutex>
-
-#include "base/array_ref.h"
-#include "base/bit_utils.h"
-#include "base/leb128.h"
-#include "dwarf/writer.h"
-
-// liblzma.
-#include "7zCrc.h"
-#include "Xz.h"
-#include "XzCrc64.h"
-#include "XzEnc.h"
-
-namespace art {
-namespace debug {
-
-constexpr size_t kChunkSize = kPageSize;
-
-static void XzInitCrc() {
- static std::once_flag crc_initialized;
- std::call_once(crc_initialized, []() {
- CrcGenerateTable();
- Crc64GenerateTable();
- });
-}
-
-void XzCompress(ArrayRef<const uint8_t> src, std::vector<uint8_t>* dst) {
- // Configure the compression library.
- XzInitCrc();
- CLzma2EncProps lzma2Props;
- Lzma2EncProps_Init(&lzma2Props);
- lzma2Props.lzmaProps.level = 1; // Fast compression.
- lzma2Props.lzmaProps.reduceSize = src.size(); // Size of data that will be compressed.
- lzma2Props.blockSize = kChunkSize;
- Lzma2EncProps_Normalize(&lzma2Props);
- CXzProps props;
- XzProps_Init(&props);
- props.lzma2Props = lzma2Props;
- // Implement the required interface for communication (written in C so no virtual methods).
- struct XzCallbacks : public ISeqInStream, public ISeqOutStream, public ICompressProgress {
- static SRes ReadImpl(const ISeqInStream* p, void* buf, size_t* size) {
- auto* ctx = static_cast<XzCallbacks*>(const_cast<ISeqInStream*>(p));
- *size = std::min(*size, ctx->src_.size() - ctx->src_pos_);
- memcpy(buf, ctx->src_.data() + ctx->src_pos_, *size);
- ctx->src_pos_ += *size;
- return SZ_OK;
- }
- static size_t WriteImpl(const ISeqOutStream* p, const void* buf, size_t size) {
- auto* ctx = static_cast<const XzCallbacks*>(p);
- const uint8_t* buffer = reinterpret_cast<const uint8_t*>(buf);
- ctx->dst_->insert(ctx->dst_->end(), buffer, buffer + size);
- return size;
- }
- static SRes ProgressImpl(const ICompressProgress* , UInt64, UInt64) {
- return SZ_OK;
- }
- size_t src_pos_;
- ArrayRef<const uint8_t> src_;
- std::vector<uint8_t>* dst_;
- };
- XzCallbacks callbacks;
- callbacks.Read = XzCallbacks::ReadImpl;
- callbacks.Write = XzCallbacks::WriteImpl;
- callbacks.Progress = XzCallbacks::ProgressImpl;
- callbacks.src_pos_ = 0;
- callbacks.src_ = src;
- callbacks.dst_ = dst;
- // Compress.
- SRes res = Xz_Encode(&callbacks, &callbacks, &props, &callbacks);
- CHECK_EQ(res, SZ_OK);
-
- // Decompress the data back and check that we get the original.
- if (kIsDebugBuild) {
- std::vector<uint8_t> decompressed;
- XzDecompress(ArrayRef<const uint8_t>(*dst), &decompressed);
- DCHECK_EQ(decompressed.size(), src.size());
- DCHECK_EQ(memcmp(decompressed.data(), src.data(), src.size()), 0);
- }
-}
-
-void XzDecompress(ArrayRef<const uint8_t> src, std::vector<uint8_t>* dst) {
- XzInitCrc();
- std::unique_ptr<CXzUnpacker> state(new CXzUnpacker());
- ISzAlloc alloc;
- alloc.Alloc = [](ISzAllocPtr, size_t size) { return malloc(size); };
- alloc.Free = [](ISzAllocPtr, void* ptr) { return free(ptr); };
- XzUnpacker_Construct(state.get(), &alloc);
-
- size_t src_offset = 0;
- size_t dst_offset = 0;
- ECoderStatus status;
- do {
- dst->resize(RoundUp(dst_offset + kPageSize / 4, kPageSize));
- size_t src_remaining = src.size() - src_offset;
- size_t dst_remaining = dst->size() - dst_offset;
- int return_val = XzUnpacker_Code(state.get(),
- dst->data() + dst_offset,
- &dst_remaining,
- src.data() + src_offset,
- &src_remaining,
- true,
- CODER_FINISH_ANY,
- &status);
- CHECK_EQ(return_val, SZ_OK);
- src_offset += src_remaining;
- dst_offset += dst_remaining;
- } while (status == CODER_STATUS_NOT_FINISHED);
- CHECK_EQ(src_offset, src.size());
- CHECK(XzUnpacker_IsStreamWasFinished(state.get()));
- XzUnpacker_Free(state.get());
- dst->resize(dst_offset);
-}
-
-} // namespace debug
-} // namespace art