Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,11 @@ CodeGenModule::CodeGenModule(ASTContext &C,
CodeGenOpts.CoverageNotesFile.size() ||
CodeGenOpts.CoverageDataFile.size())
DebugInfo.reset(new CGDebugInfo(*this));
else if (getTriple().isOSWindows())
// On Windows targets, we want to emit compiler info even if debug info is
// otherwise disabled. Use a temporary CGDebugInfo instance to emit only
// basic compiler metadata.
CGDebugInfo(*this);

Block.GlobalUniqueCount = 0;

Expand Down Expand Up @@ -1051,7 +1056,7 @@ void CodeGenModule::Release() {
"StrictVTablePointersRequirement",
llvm::MDNode::get(VMContext, Ops));
}
if (getModuleDebugInfo())
if (getModuleDebugInfo() || getTriple().isOSWindows())
// We support a single version in the linked module. The LLVM
// parser will drop debug info with a different version number
// (and warn about it, too).
Expand Down
8 changes: 8 additions & 0 deletions clang/test/CodeGen/debug-info-version-coff.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// REQUIRES: x86-registered-target
// RUN: %clang --target=x86_64-windows -g -S -emit-llvm -o - %s | FileCheck %s
// RUN: %clang --target=x86_64-windows -S -emit-llvm -o - %s | FileCheck %s
int main (void) {
return 0;
}

// CHECK: i32 2, !"Debug Info Version", i32 3}
1 change: 1 addition & 0 deletions clang/test/CodeGen/debug-info-version.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// REQUIRES: !system-windows
// RUN: %clang -g -S -emit-llvm -o - %s | FileCheck %s
// RUN: %clang -S -emit-llvm -o - %s | FileCheck %s --check-prefix=NO_DEBUG
int main (void) {
Expand Down
37 changes: 37 additions & 0 deletions clang/test/CodeGenCXX/debug-info-coff.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// REQUIRES: x86-registered-target

// Check that CodeView compiler version is emitted even when debug info is otherwise disabled.

// RUN: %clang --target=i686-pc-windows-msvc -S -emit-llvm %s -o - | FileCheck --check-prefix=IR %s
// IR: !llvm.dbg.cu = !{!0}
// IR: !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version {{.*}}", isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug, splitDebugInlining: false, nameTableKind: None)

// RUN: %clang --target=i686-pc-windows-msvc -c %s -o %t.o
// RUN: llvm-readobj --codeview %t.o | FileCheck %s
// CHECK: CodeViewDebugInfo [
// CHECK-NEXT: Section: .debug$S (4)
// CHECK-NEXT: Magic: 0x4
// CHECK-NEXT: Subsection [
// CHECK-NEXT: SubSectionType: Symbols (0xF1)
// CHECK-NEXT: SubSectionSize:
// CHECK-NEXT: ObjNameSym {
// CHECK-NEXT: Kind: S_OBJNAME (0x1101)
// CHECK-NEXT: Signature: 0x0
// CHECK-NEXT: ObjectName:
// CHECK-NEXT: }
// CHECK-NEXT: Compile3Sym {
// CHECK-NEXT: Kind: S_COMPILE3 (0x113C)
// CHECK-NEXT: Language: Cpp (0x1)
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
// CHECK-NEXT: Machine: Pentium3 (0x7)
// CHECK-NEXT: FrontendVersion:
// CHECK-NEXT: BackendVersion:
// CHECK-NEXT: VersionName: clang version
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: ]

int main() {
return 0;
}
7 changes: 2 additions & 5 deletions clang/test/CodeGenCXX/debug-info-hotpatch-aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,9 @@
// RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=HOTPATCH
// HOTPATCH: S_COMPILE3 [size = [[#]]]
// HOTPATCH: flags = hot patchable
///
/// Unfortunately we need /Z7, Clang does not systematically generate S_COMPILE3.
///
//
// RUN: %clang_cl --target=aarch64-pc-windows-msvc /c -o %t.obj -- %s
// RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=NO-HOTPATCH
// NO-HOTPATCH-NOT: flags = hot patchable
// RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=HOTPATCH

int main() {
return 0;
Expand Down
7 changes: 2 additions & 5 deletions clang/test/CodeGenCXX/debug-info-hotpatch-arm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,9 @@
// RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=HOTPATCH
// HOTPATCH: S_COMPILE3 [size = [[#]]]
// HOTPATCH: flags = hot patchable
///
/// Unfortunately we need /Z7, Clang does not systematically generate S_COMPILE3.
///
//
// RUN: %clang_cl --target=arm-pc-windows-msvc /c -o %t.obj -- %s
// RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=NO-HOTPATCH
// NO-HOTPATCH-NOT: flags = hot patchable
// RUN: llvm-pdbutil dump -symbols %t.obj | FileCheck %s --check-prefix=HOTPATCH

int main() {
return 0;
Expand Down
4 changes: 2 additions & 2 deletions clang/test/Frontend/ast-main.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// RUN: env SDKROOT="/" %clang -emit-llvm -S -o %t1.ll -x c - < %s
// RUN: env SDKROOT="/" %clang -emit-llvm -S -o - -x c - < %s | grep -v DIFile > %t1.ll
// RUN: env SDKROOT="/" %clang -emit-ast -o %t.ast %s
// RUN: env SDKROOT="/" %clang -emit-llvm -S -o %t2.ll -x ast - < %t.ast
// RUN: env SDKROOT="/" %clang -emit-llvm -S -o - -x ast - < %t.ast | grep -v DIFile > %t2.ll
// RUN: diff %t1.ll %t2.ll

int main(void) {
Expand Down
4 changes: 2 additions & 2 deletions clang/test/Frontend/ast-main.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// RUN: env SDKROOT="/" %clang -Wno-error=return-type -emit-llvm -S -o %t1.ll -x c++ - < %s
// RUN: env SDKROOT="/" %clang -Wno-error=return-type -emit-llvm -S -o - -x c++ - < %s | grep -v DIFile > %t1.ll
// RUN: env SDKROOT="/" %clang -Wno-error=return-type -fno-delayed-template-parsing -emit-ast -o %t.ast %s
// RUN: env SDKROOT="/" %clang -Wno-error=return-type -emit-llvm -S -o %t2.ll -x ast - < %t.ast
// RUN: env SDKROOT="/" %clang -Wno-error=return-type -emit-llvm -S -o - -x ast - < %t.ast | grep -v DIFile > %t2.ll
// RUN: diff %t1.ll %t2.ll

// http://llvm.org/bugs/show_bug.cgi?id=15377
Expand Down
10 changes: 5 additions & 5 deletions clang/test/Frontend/ir-support.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
// We strip differing '.file' directives before comparing.

// Reference output:
// RUN: %clang_cc1 -S -o - %s | grep -v '\.file' > %t.s
// RUN: %clang_cc1 -triple=x86_64-windows -S -o - %s | grep -v '\.file' > %t.s

// LLVM bitcode:
// RUN: %clang_cc1 -emit-llvm-bc -o %t.bc %s
// RUN: %clang_cc1 -S -o - %t.bc | grep -v '\.file' > %t.bc.s
// RUN: %clang_cc1 -triple=x86_64-windows -emit-llvm-bc -o %t.bc %s
// RUN: %clang_cc1 -triple=x86_64-windows -S -o - %t.bc | grep -v '\.file' > %t.bc.s
// RUN: diff %t.s %t.bc.s

// LLVM IR source code:
// RUN: %clang_cc1 -emit-llvm -o %t.ll %s
// RUN: %clang_cc1 -S -o - %t.ll | grep -v '\.file' > %t.ll.s
// RUN: %clang_cc1 -triple=x86_64-windows -emit-llvm -o %t.ll %s
// RUN: %clang_cc1 -triple=x86_64-windows -S -o - %t.ll | grep -v '\.file' > %t.ll.s
// RUN: diff %t.s %t.ll.s

int f(void) { return 0; }
7 changes: 5 additions & 2 deletions llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,8 +561,11 @@ bool AsmPrinter::doInitialization(Module &M) {

if (MAI->doesSupportDebugInformation()) {
bool EmitCodeView = M.getCodeViewFlag();
if (EmitCodeView &&
(TM.getTargetTriple().isOSWindows() || TM.getTargetTriple().isUEFI()))
// On Windows targets, emit minimal CodeView compiler info even when debug
// info is disabled.
if ((TM.getTargetTriple().isOSWindows() &&
M.getNamedMetadata("llvm.dbg.cu")) ||
(TM.getTargetTriple().isUEFI() && EmitCodeView))
Handlers.push_back(std::make_unique<CodeViewDebug>(this));
if (!EmitCodeView || M.getDwarfVersion()) {
if (hasDebugInfo()) {
Expand Down
34 changes: 25 additions & 9 deletions llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ static CPUType mapArchToCVCPUType(Triple::ArchType Type) {
return CPUType::ARM64;
case Triple::ArchType::mipsel:
return CPUType::MIPS;
case Triple::ArchType::UnknownArch:
return CPUType::Unknown;
default:
report_fatal_error("target architecture doesn't map to a CodeView CPUType");
}
Expand Down Expand Up @@ -611,21 +613,33 @@ static SourceLanguage MapDWLangToCVLang(unsigned DWLang) {
}

void CodeViewDebug::beginModule(Module *M) {
// If module doesn't have named metadata anchors or COFF debug section
// is not available, skip any debug info related stuff.
if (!Asm->hasDebugInfo() ||
!Asm->getObjFileLowering().getCOFFDebugSymbolsSection()) {
// If COFF debug section is not available, skip any debug info related stuff.
if (!Asm->getObjFileLowering().getCOFFDebugSymbolsSection()) {
Asm = nullptr;
return;
}

CompilerInfoAsm = Asm;
TheCPU = mapArchToCVCPUType(M->getTargetTriple().getArch());

// Get the current source language.
const MDNode *Node = *M->debug_compile_units_begin();
const MDNode *Node;
if (Asm->hasDebugInfo()) {
Node = *M->debug_compile_units_begin();
} else {
// When emitting only compiler information, we may have only NoDebug CUs,
// which would be skipped by debug_compile_units_begin.
NamedMDNode *CUs = MMI->getModule()->getNamedMetadata("llvm.dbg.cu");
Node = *CUs->operands().begin();
}
const auto *CU = cast<DICompileUnit>(Node);

CurrentSourceLanguage = MapDWLangToCVLang(CU->getSourceLanguage());
if (!M->getCodeViewFlag() ||
CU->getEmissionKind() == DICompileUnit::NoDebug) {
Asm = nullptr;
return;
}

collectGlobalVariableInfo();

Expand All @@ -636,7 +650,7 @@ void CodeViewDebug::beginModule(Module *M) {
}

void CodeViewDebug::endModule() {
if (!Asm || !Asm->hasDebugInfo())
if (!CompilerInfoAsm)
return;

// The COFF .debug$S section consists of several subsections, each starting
Expand All @@ -652,6 +666,8 @@ void CodeViewDebug::endModule() {
emitObjName();
emitCompilerInformation();
endCVSubsection(CompilerInfo);
if (!Asm)
return;

emitInlineeLinesSubsection();

Expand Down Expand Up @@ -788,7 +804,7 @@ void CodeViewDebug::emitTypeGlobalHashes() {
void CodeViewDebug::emitObjName() {
MCSymbol *CompilerEnd = beginSymbolRecord(SymbolKind::S_OBJNAME);

StringRef PathRef(Asm->TM.Options.ObjectFilenameForDebug);
StringRef PathRef(CompilerInfoAsm->TM.Options.ObjectFilenameForDebug);
llvm::SmallString<256> PathStore(PathRef);

if (PathRef.empty() || PathRef == "-") {
Expand Down Expand Up @@ -846,7 +862,7 @@ void CodeViewDebug::emitCompilerInformation() {
}
using ArchType = llvm::Triple::ArchType;
ArchType Arch = MMI->getModule()->getTargetTriple().getArch();
if (Asm->TM.Options.Hotpatch || Arch == ArchType::thumb ||
if (CompilerInfoAsm->TM.Options.Hotpatch || Arch == ArchType::thumb ||
Arch == ArchType::aarch64) {
Flags |= static_cast<uint32_t>(CompileSym3Flags::HotPatch);
}
Expand Down Expand Up @@ -1015,7 +1031,7 @@ void CodeViewDebug::switchToDebugSectionForSymbol(const MCSymbol *GVSym) {
const MCSymbol *KeySym = GVSec ? GVSec->getCOMDATSymbol() : nullptr;

MCSectionCOFF *DebugSec = cast<MCSectionCOFF>(
Asm->getObjFileLowering().getCOFFDebugSymbolsSection());
CompilerInfoAsm->getObjFileLowering().getCOFFDebugSymbolsSection());
DebugSec = OS.getContext().getAssociativeCOFFSection(DebugSec, KeySym);

OS.switchSection(DebugSec);
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase {
/// The codeview CPU type used by the translation unit.
codeview::CPUType TheCPU;

/// The AsmPrinter used for emitting compiler metadata. When only compiler
/// info is being emitted, DebugHandlerBase::Asm may be null.
AsmPrinter *CompilerInfoAsm = nullptr;

static LocalVarDef createDefRangeMem(uint16_t CVRegister, int Offset);

/// Similar to DbgVariable in DwarfDebug, but not dwarf-specific.
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/CodeGen/Generic/selection-dag-determinism.ll
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
; RUN: llc -O2 -o %t1.o < %s
; RUN: llc -O2 -o %t2.o < %s
; RUN: llc -O2 -o %t3.o < %s
; RUN: llc -O2 -o %t4.o < %s
; RUN: llc -O2 -o %t5.o < %s
; RUN: llc -O2 < %s > %t1.o
; RUN: llc -O2 < %s > %t2.o
; RUN: llc -O2 < %s > %t3.o
; RUN: llc -O2 < %s > %t4.o
; RUN: llc -O2 < %s > %t5.o
; RUN: cmp %t1.o %t2.o
; RUN: cmp %t1.o %t3.o
; RUN: cmp %t1.o %t4.o
Expand Down
27 changes: 27 additions & 0 deletions llvm/test/DebugInfo/COFF/dwarf-headers.ll
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,33 @@
; DWO-4: 0x00000000: Compile Unit: {{.*}} version = 0x0004, abbr_offset
; DWO-4: 0x0000000b: DW_TAG_compile_unit

; Check that basic CodeView compiler info is emitted even when the DWARF debug format is used.
; RUN: llc -dwarf-version=4 \
; RUN: -filetype=obj -O0 -mtriple=x86_64-unknown-windows-msvc < %s \
; RUN: | llvm-readobj --codeview - | FileCheck %s --check-prefix=CODEVIEW
; CODEVIEW: CodeViewDebugInfo [
; CODEVIEW-NEXT: Section: .debug$S (4)
; CODEVIEW-NEXT: Magic: 0x4
; CODEVIEW-NEXT: Subsection [
; CODEVIEW-NEXT: SubSectionType: Symbols (0xF1)
; CODEVIEW-NEXT: SubSectionSize: 0x90
; CODEVIEW-NEXT: ObjNameSym {
; CODEVIEW-NEXT: Kind: S_OBJNAME (0x1101)
; CODEVIEW-NEXT: Signature: 0x0
; CODEVIEW-NEXT: ObjectName:
; CODEVIEW-NEXT: }
; CODEVIEW-NEXT: Compile3Sym {
; CODEVIEW-NEXT: Kind: S_COMPILE3 (0x113C)
; CODEVIEW-NEXT: Language: Cpp (0x1)
; CODEVIEW-NEXT: Flags [ (0x0)
; CODEVIEW-NEXT: ]
; CODEVIEW-NEXT: Machine: X64 (0xD0)
; CODEVIEW-NEXT: FrontendVersion: 17.0.0.0
; CODEVIEW-NEXT: BackendVersion:
; CODEVIEW-NEXT: VersionName: clang version 17.0.0
; CODEVIEW-NEXT: }
; CODEVIEW-NEXT: ]
; CODEVIEW-NEXT: ]

; ModuleID = 't.cpp'
source_filename = "t.cpp"
Expand Down
38 changes: 38 additions & 0 deletions llvm/test/DebugInfo/COFF/emission-kind-no-codeview.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
; RUN: llc -filetype=obj -o - < %s | llvm-readobj --codeview - | FileCheck %s
; Check that basic CodeView compiler info is emitted even when the CodeView flag is not set.

; CHECK-NOT: CodeViewTypes
; CHECK: CodeViewDebugInfo [
; CHECK-NEXT: Section: .debug$S (4)
; CHECK-NEXT: Magic: 0x4
; CHECK-NEXT: Subsection [
; CHECK-NEXT: SubSectionType: Symbols (0xF1)
; CHECK-NEXT: SubSectionSize: 0x2C
; CHECK-NEXT: ObjNameSym {
; CHECK-NEXT: Kind: S_OBJNAME (0x1101)
; CHECK-NEXT: Signature: 0x0
; CHECK-NEXT: ObjectName:
; CHECK-NEXT: }
; CHECK-NEXT: Compile3Sym {
; CHECK-NEXT: Kind: S_COMPILE3 (0x113C)
; CHECK-NEXT: Language: C (0x0)
; CHECK-NEXT: Flags [ (0x0)
; CHECK-NEXT: ]
; CHECK-NEXT: Machine: X64 (0xD0)
; CHECK-NEXT: FrontendVersion:
; CHECK-NEXT: BackendVersion:
; CHECK-NEXT: VersionName: clang
; CHECK-NEXT: }
; CHECK-NEXT: ]
; CHECK-NEXT: ]

source_filename = "empty"
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc19.0.24215"

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2}

!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "clang", emissionKind: NoDebug)
!1 = !DIFile(filename: "empty", directory: "path/to")
!2 = !{i32 2, !"Debug Info Version", i32 3}
28 changes: 25 additions & 3 deletions llvm/test/DebugInfo/COFF/emission-kind-no-debug.ll
Original file line number Diff line number Diff line change
@@ -1,8 +1,30 @@
; RUN: llc -filetype=obj -o - < %s | llvm-readobj --codeview - | FileCheck %s
; Check that debug info isn't emitted for CodeView with emissionKind NoDebug
; Check that only basic compiler info is emitted for CodeView with emissionKind NoDebug

; CHECK-NOT: CodeViewTypes
; CHECK-NOT: CodeViewDebugInfo
; CHECK-NOT: CodeViewTypes
; CHECK: CodeViewDebugInfo [
; CHECK-NEXT: Section: .debug$S (4)
; CHECK-NEXT: Magic: 0x4
; CHECK-NEXT: Subsection [
; CHECK-NEXT: SubSectionType: Symbols (0xF1)
; CHECK-NEXT: SubSectionSize: 0x2C
; CHECK-NEXT: ObjNameSym {
; CHECK-NEXT: Kind: S_OBJNAME (0x1101)
; CHECK-NEXT: Signature: 0x0
; CHECK-NEXT: ObjectName:
; CHECK-NEXT: }
; CHECK-NEXT: Compile3Sym {
; CHECK-NEXT: Kind: S_COMPILE3 (0x113C)
; CHECK-NEXT: Language: C (0x0)
; CHECK-NEXT: Flags [ (0x0)
; CHECK-NEXT: ]
; CHECK-NEXT: Machine: X64 (0xD0)
; CHECK-NEXT: FrontendVersion:
; CHECK-NEXT: BackendVersion:
; CHECK-NEXT: VersionName: clang
; CHECK-NEXT: }
; CHECK-NEXT: ]
; CHECK-NEXT: ]

source_filename = "empty"
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/DebugInfo/COFF/fission-cu.ll
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,11 @@ source_filename = "test/DebugInfo/X86/fission-cu.ll"
; For COFF we should have this set of relocations for the debug info section
;
; OBJ: .debug_info
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_abbrev (6)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_line (26)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_str (10)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_str (10)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_addr (20)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_abbrev (8)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_line (28)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_str (12)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_str (12)
; OBJ-NEXT: IMAGE_REL_AMD64_SECREL .debug_addr (22)
; OBJ-NEXT: }

; HDR-NOT: .debug_aranges
Expand Down
Loading