Reaplying after revert in #85382 (861ebe6446296c96578807363aa292c69d827773). Fixed intermittent test failure by avoiding piping output in some RUN lines. If --write-experimental-debuginfo-iterators-to-bitcode is true (default false) and --expermental-debuginfo-iterators is also true then the new debug info format (non-instruction records) is written to bitcode directly. Added the following records: FUNC_CODE_DEBUG_RECORD_LABEL FUNC_CODE_DEBUG_RECORD_VALUE FUNC_CODE_DEBUG_RECORD_DECLARE FUNC_CODE_DEBUG_RECORD_ASSIGN FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE The last one has an abbrev in FUNCTION_BLOCK BLOCK_INFO. Incidentally, this uses the last value available without widening the code-length for FUNCTION_BLOCK from 4 to 5 bits. Records are formatted as follows: All DbgRecord start with: 1. DILocation FUNC_CODE_DEBUG_RECORD_LABEL 2. DILabel DPValues then share common fields: 2. DILocalVariable 3. DIExpression FUNC_CODE_DEBUG_RECORD_VALUE 4. Location Metadata FUNC_CODE_DEBUG_RECORD_DECLARE 4. Location Metadata FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE 4. Location Value (single) FUNC_CODE_DEBUG_RECORD_ASSIGN 4. Location Metadata 5. DIAssignID 6. DIExpression (address) 7. Location Metadata (address) Encoding the DILocation metadata reference directly appeared to yield smaller bitcode files than encoding the operands seperately (as is done with instruction DILocations). FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE is by far the most common DbgRecord record in optimized code (order of 5x-10x over other kinds). Unoptimized code should only contain FUNC_CODE_DEBUG_RECORD_DECLARE.
93 lines
3.2 KiB
C++
93 lines
3.2 KiB
C++
//===- BitcodeWriterPass.cpp - Bitcode writing pass -----------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// BitcodeWriterPass implementation.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Bitcode/BitcodeWriterPass.h"
|
|
#include "llvm/Analysis/ModuleSummaryAnalysis.h"
|
|
#include "llvm/Bitcode/BitcodeWriter.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/InitializePasses.h"
|
|
#include "llvm/Pass.h"
|
|
using namespace llvm;
|
|
|
|
extern bool WriteNewDbgInfoFormatToBitcode;
|
|
|
|
PreservedAnalyses BitcodeWriterPass::run(Module &M, ModuleAnalysisManager &AM) {
|
|
bool ConvertToOldDbgFormatForWrite =
|
|
M.IsNewDbgInfoFormat && !WriteNewDbgInfoFormatToBitcode;
|
|
if (ConvertToOldDbgFormatForWrite)
|
|
M.convertFromNewDbgValues();
|
|
|
|
const ModuleSummaryIndex *Index =
|
|
EmitSummaryIndex ? &(AM.getResult<ModuleSummaryIndexAnalysis>(M))
|
|
: nullptr;
|
|
WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, Index, EmitModuleHash);
|
|
|
|
if (ConvertToOldDbgFormatForWrite)
|
|
M.convertToNewDbgValues();
|
|
|
|
return PreservedAnalyses::all();
|
|
}
|
|
|
|
namespace {
|
|
class WriteBitcodePass : public ModulePass {
|
|
raw_ostream &OS; // raw_ostream to print on
|
|
bool ShouldPreserveUseListOrder;
|
|
|
|
public:
|
|
static char ID; // Pass identification, replacement for typeid
|
|
WriteBitcodePass() : ModulePass(ID), OS(dbgs()) {
|
|
initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
explicit WriteBitcodePass(raw_ostream &o, bool ShouldPreserveUseListOrder)
|
|
: ModulePass(ID), OS(o),
|
|
ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {
|
|
initializeWriteBitcodePassPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
|
|
StringRef getPassName() const override { return "Bitcode Writer"; }
|
|
|
|
bool runOnModule(Module &M) override {
|
|
bool ConvertToOldDbgFormatForWrite =
|
|
M.IsNewDbgInfoFormat && !WriteNewDbgInfoFormatToBitcode;
|
|
if (ConvertToOldDbgFormatForWrite)
|
|
M.convertFromNewDbgValues();
|
|
|
|
WriteBitcodeToFile(M, OS, ShouldPreserveUseListOrder, /*Index=*/nullptr,
|
|
/*EmitModuleHash=*/false);
|
|
|
|
if (ConvertToOldDbgFormatForWrite)
|
|
M.convertToNewDbgValues();
|
|
return false;
|
|
}
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesAll();
|
|
}
|
|
};
|
|
}
|
|
|
|
char WriteBitcodePass::ID = 0;
|
|
INITIALIZE_PASS_BEGIN(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
|
|
true)
|
|
INITIALIZE_PASS_DEPENDENCY(ModuleSummaryIndexWrapperPass)
|
|
INITIALIZE_PASS_END(WriteBitcodePass, "write-bitcode", "Write Bitcode", false,
|
|
true)
|
|
|
|
ModulePass *llvm::createBitcodeWriterPass(raw_ostream &Str,
|
|
bool ShouldPreserveUseListOrder) {
|
|
return new WriteBitcodePass(Str, ShouldPreserveUseListOrder);
|
|
}
|
|
|
|
bool llvm::isBitcodeWriterPass(Pass *P) {
|
|
return P->getPassID() == (llvm::AnalysisID)&WriteBitcodePass::ID;
|
|
}
|