[llvm] c3c501f - [DebugInfo] Add new emitting methods for values which depend on the DWARF format (3/19).
Igor Kudrin via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 22:24:21 PDT 2020
Author: Igor Kudrin
Date: 2020-09-15T11:30:10+07:00
New Revision: c3c501f5d79130fe9bbe4f6ca689f2d83f92373e
URL: https://github.com/llvm/llvm-project/commit/c3c501f5d79130fe9bbe4f6ca689f2d83f92373e
DIFF: https://github.com/llvm/llvm-project/commit/c3c501f5d79130fe9bbe4f6ca689f2d83f92373e.diff
LOG: [DebugInfo] Add new emitting methods for values which depend on the DWARF format (3/19).
These methods are going to be used in subsequent patches.
Differential Revision: https://reviews.llvm.org/D87010
Added:
Modified:
llvm/include/llvm/CodeGen/AsmPrinter.h
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h b/llvm/include/llvm/CodeGen/AsmPrinter.h
index 89d266b4286b..11ba36aee5a8 100644
--- a/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -221,6 +221,9 @@ class AsmPrinter : public MachineFunctionPass {
/// Returns 4 for DWARF32 and 8 for DWARF64.
unsigned int getDwarfOffsetByteSize() const;
+ /// Returns 4 for DWARF32 and 12 for DWARF64.
+ unsigned int getUnitLengthFieldByteSize() const;
+
bool isPositionIndependent() const;
/// Return true if assembly output should contain comments.
@@ -613,6 +616,21 @@ class AsmPrinter : public MachineFunctionPass {
/// depending on the DWARF format.
void emitDwarfOffset(const MCSymbol *Label, uint64_t Offset) const;
+ /// Emit 32- or 64-bit value depending on the DWARF format.
+ void emitDwarfLengthOrOffset(uint64_t Value) const;
+
+ /// Emit a special value of 0xffffffff if producing 64-bit debugging info.
+ void maybeEmitDwarf64Mark() const;
+
+ /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
+ /// according to the settings.
+ void emitDwarfUnitLength(uint64_t Length, const Twine &Comment) const;
+
+ /// Emit a unit length field. The actual format, DWARF32 or DWARF64, is chosen
+ /// according to the settings.
+ void emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo,
+ const Twine &Comment) const;
+
/// Emit reference to a call site with a specified encoding
void emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo,
unsigned Encoding) const;
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 35a40bb277b9..7d8355c04969 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -3441,3 +3441,8 @@ unsigned int AsmPrinter::getDwarfOffsetByteSize() const {
return dwarf::getDwarfOffsetByteSize(
OutStreamer->getContext().getDwarfFormat());
}
+
+unsigned int AsmPrinter::getUnitLengthFieldByteSize() const {
+ return dwarf::getUnitLengthFieldByteSize(
+ OutStreamer->getContext().getDwarfFormat());
+}
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
index 7f8f6c646925..594b41bcea53 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
@@ -27,6 +27,7 @@
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetMachine.h"
+#include <cstdint>
using namespace llvm;
#define DEBUG_TYPE "asm-printer"
@@ -187,6 +188,33 @@ void AsmPrinter::emitDwarfOffset(const MCSymbol *Label, uint64_t Offset) const {
emitLabelPlusOffset(Label, Offset, getDwarfOffsetByteSize());
}
+void AsmPrinter::emitDwarfLengthOrOffset(uint64_t Value) const {
+ assert(isDwarf64() || Value <= UINT32_MAX);
+ OutStreamer->emitIntValue(Value, getDwarfOffsetByteSize());
+}
+
+void AsmPrinter::maybeEmitDwarf64Mark() const {
+ if (!isDwarf64())
+ return;
+ OutStreamer->AddComment("DWARF64 Mark");
+ OutStreamer->emitInt32(dwarf::DW_LENGTH_DWARF64);
+}
+
+void AsmPrinter::emitDwarfUnitLength(uint64_t Length,
+ const Twine &Comment) const {
+ assert(isDwarf64() || Length <= dwarf::DW_LENGTH_lo_reserved);
+ maybeEmitDwarf64Mark();
+ OutStreamer->AddComment(Comment);
+ OutStreamer->emitIntValue(Length, getDwarfOffsetByteSize());
+}
+
+void AsmPrinter::emitDwarfUnitLength(const MCSymbol *Hi, const MCSymbol *Lo,
+ const Twine &Comment) const {
+ maybeEmitDwarf64Mark();
+ OutStreamer->AddComment(Comment);
+ OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, getDwarfOffsetByteSize());
+}
+
void AsmPrinter::emitCallSiteOffset(const MCSymbol *Hi, const MCSymbol *Lo,
unsigned Encoding) const {
// The least significant 3 bits specify the width of the encoding
diff --git a/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp b/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
index 948b8851149d..5c53f39fd9a3 100644
--- a/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
+++ b/llvm/unittests/CodeGen/AsmPrinterDwarfTest.cpp
@@ -14,6 +14,7 @@
using namespace llvm;
using testing::_;
+using testing::InSequence;
using testing::SaveArg;
namespace {
@@ -250,4 +251,120 @@ TEST_F(AsmPrinterEmitDwarfOffsetTest, DWARF64) {
EXPECT_EQ(static_cast<uint64_t>(ActualRHS->getValue()), Offset);
}
+class AsmPrinterEmitDwarfLengthOrOffsetTest : public AsmPrinterFixtureBase {
+protected:
+ uint64_t Val = 42;
+};
+
+TEST_F(AsmPrinterEmitDwarfLengthOrOffsetTest, DWARF32) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
+ return;
+
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 4));
+ TestPrinter->getAP()->emitDwarfLengthOrOffset(Val);
+}
+
+TEST_F(AsmPrinterEmitDwarfLengthOrOffsetTest, DWARF64) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
+ return;
+
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 8));
+ TestPrinter->getAP()->emitDwarfLengthOrOffset(Val);
+}
+
+class AsmPrinterGetUnitLengthFieldByteSizeTest : public AsmPrinterFixtureBase {
+};
+
+TEST_F(AsmPrinterGetUnitLengthFieldByteSizeTest, DWARF32) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
+ return;
+
+ EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 4u);
+}
+
+TEST_F(AsmPrinterGetUnitLengthFieldByteSizeTest, DWARF64) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
+ return;
+
+ EXPECT_EQ(TestPrinter->getAP()->getUnitLengthFieldByteSize(), 12u);
+}
+
+class AsmPrinterMaybeEmitDwarf64MarkTest : public AsmPrinterFixtureBase {};
+
+TEST_F(AsmPrinterMaybeEmitDwarf64MarkTest, DWARF32) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
+ return;
+
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(_, _)).Times(0);
+ TestPrinter->getAP()->maybeEmitDwarf64Mark();
+}
+
+TEST_F(AsmPrinterMaybeEmitDwarf64MarkTest, DWARF64) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
+ return;
+
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4));
+ TestPrinter->getAP()->maybeEmitDwarf64Mark();
+}
+
+class AsmPrinterEmitDwarfUnitLengthAsIntTest : public AsmPrinterFixtureBase {
+protected:
+ uint64_t Val = 42;
+};
+
+TEST_F(AsmPrinterEmitDwarfUnitLengthAsIntTest, DWARF32) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
+ return;
+
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 4));
+ TestPrinter->getAP()->emitDwarfUnitLength(Val, "");
+}
+
+TEST_F(AsmPrinterEmitDwarfUnitLengthAsIntTest, DWARF64) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
+ return;
+
+ InSequence S;
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4));
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(Val, 8));
+
+ TestPrinter->getAP()->emitDwarfUnitLength(Val, "");
+}
+
+class AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest
+ : public AsmPrinterFixtureBase {
+protected:
+ bool init(const std::string &TripleStr, unsigned DwarfVersion,
+ dwarf::DwarfFormat DwarfFormat) {
+ if (!AsmPrinterFixtureBase::init(TripleStr, DwarfVersion, DwarfFormat))
+ return false;
+
+ Hi = TestPrinter->getCtx().createTempSymbol();
+ Lo = TestPrinter->getCtx().createTempSymbol();
+ return true;
+ }
+
+ MCSymbol *Hi = nullptr;
+ MCSymbol *Lo = nullptr;
+};
+
+TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF32) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF32))
+ return;
+
+ EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, 4));
+ TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, "");
+}
+
+TEST_F(AsmPrinterEmitDwarfUnitLengthAsHiLoDiffTest, DWARF64) {
+ if (!init("x86_64-pc-linux", /*DwarfVersion=*/4, dwarf::DWARF64))
+ return;
+
+ InSequence S;
+ EXPECT_CALL(TestPrinter->getMS(), emitIntValue(dwarf::DW_LENGTH_DWARF64, 4));
+ EXPECT_CALL(TestPrinter->getMS(), emitAbsoluteSymbolDiff(Hi, Lo, 8));
+
+ TestPrinter->getAP()->emitDwarfUnitLength(Hi, Lo, "");
+}
+
} // end namespace
More information about the llvm-commits
mailing list