Skip to content

Commit

Permalink
[DebugInfo] Don't emit checksums when compiling a preprocessed CPP
Browse files Browse the repository at this point in the history
Fixes PR41215

Differential Revision: https://reviews.llvm.org/D60283

llvm-svn: 361296
  • Loading branch information
aganea authored and MrSidims committed May 24, 2019
1 parent 79d3226 commit 81d6a60
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 5 deletions.
11 changes: 9 additions & 2 deletions clang/include/clang/Basic/SourceLocation.h
Expand Up @@ -282,13 +282,15 @@ class CharSourceRange {
/// You can get a PresumedLoc from a SourceLocation with SourceManager.
class PresumedLoc {
const char *Filename = nullptr;
FileID ID;
unsigned Line, Col;
SourceLocation IncludeLoc;

public:
PresumedLoc() = default;
PresumedLoc(const char *FN, unsigned Ln, unsigned Co, SourceLocation IL)
: Filename(FN), Line(Ln), Col(Co), IncludeLoc(IL) {}
PresumedLoc(const char *FN, FileID FID, unsigned Ln, unsigned Co,
SourceLocation IL)
: Filename(FN), ID(FID), Line(Ln), Col(Co), IncludeLoc(IL) {}

/// Return true if this object is invalid or uninitialized.
///
Expand All @@ -305,6 +307,11 @@ class PresumedLoc {
return Filename;
}

FileID getFileID() const {
assert(isValid());
return ID;
}

/// Return the presumed line number of this location.
///
/// This can be affected by \#line etc.
Expand Down
9 changes: 7 additions & 2 deletions clang/lib/Basic/SourceManager.cpp
Expand Up @@ -1430,6 +1430,7 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc,
// To get the source name, first consult the FileEntry (if one exists)
// before the MemBuffer as this will avoid unnecessarily paging in the
// MemBuffer.
FileID FID = LocInfo.first;
StringRef Filename;
if (C->OrigEntry)
Filename = C->OrigEntry->getName();
Expand All @@ -1453,8 +1454,12 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc,
if (const LineEntry *Entry =
LineTable->FindNearestLineEntry(LocInfo.first, LocInfo.second)) {
// If the LineEntry indicates a filename, use it.
if (Entry->FilenameID != -1)
if (Entry->FilenameID != -1) {
Filename = LineTable->getFilename(Entry->FilenameID);
// The contents of files referenced by #line are not in the
// SourceManager
FID = FileID::get(0);
}

// Use the line number specified by the LineEntry. This line number may
// be multiple lines down from the line entry. Add the difference in
Expand All @@ -1473,7 +1478,7 @@ PresumedLoc SourceManager::getPresumedLoc(SourceLocation Loc,
}
}

return PresumedLoc(Filename.data(), LineNo, ColNo, IncludeLoc);
return PresumedLoc(Filename.data(), FID, LineNo, ColNo, IncludeLoc);
}

/// Returns whether the PresumedLoc for a given SourceLocation is
Expand Down
6 changes: 5 additions & 1 deletion clang/lib/CodeGen/CGDebugInfo.cpp
Expand Up @@ -422,8 +422,12 @@ llvm::DIFile *CGDebugInfo::getOrCreateFile(SourceLocation Loc) {
}

SmallString<32> Checksum;

// Compute the checksum if possible. If the location is affected by a #line
// directive that refers to a file, PLoc will have an invalid FileID, and we
// will correctly get no checksum.
Optional<llvm::DIFile::ChecksumKind> CSKind =
computeChecksum(SM.getFileID(Loc), Checksum);
computeChecksum(PLoc.getFileID(), Checksum);
Optional<llvm::DIFile::ChecksumInfo<StringRef>> CSInfo;
if (CSKind)
CSInfo.emplace(*CSKind, Checksum);
Expand Down
9 changes: 9 additions & 0 deletions clang/test/CodeGen/Inputs/debug-info-file-checksum-line.cpp
@@ -0,0 +1,9 @@
int foo(int x) {
return x+1;
}

#line 100
void test1() {}

#line 200
void test2() {}
10 changes: 10 additions & 0 deletions clang/test/CodeGen/Inputs/debug-info-file-checksum-pre.cpp
@@ -0,0 +1,10 @@
#line 1 "F:\\svn\\clang\\test\\CodeGen\\Inputs\\debug-info-file-checksum.c"
#line 1 "f:\\svn\\clang\\test\\codegen\\inputs\\code-coverage-filter1.h"
void test1() {}
#line 2 "F:\\svn\\clang\\test\\CodeGen\\Inputs\\debug-info-file-checksum.c"
#line 1 "f:\\svn\\clang\\test\\codegen\\inputs\\code-coverage-filter2.h"
void test2() {}
#line 3 "F:\\svn\\clang\\test\\CodeGen\\Inputs\\debug-info-file-checksum.c"
int foo(int x) {
return x+1;
}
12 changes: 12 additions & 0 deletions clang/test/CodeGen/debug-info-file-checksum.c
Expand Up @@ -4,3 +4,15 @@
// Check that "checksum" is created correctly for the compiled file.

// CHECK: !DIFile(filename:{{.*}}, directory:{{.*}}, checksumkind: CSK_MD5, checksum: "a3b7d27af071accdeccaa933fc603608")

// Ensure #line directives (in already pre-processed files) do not emit checksums
// RUN: %clang -emit-llvm -S -g -gcodeview -x c %S/Inputs/debug-info-file-checksum-pre.cpp -o - | FileCheck %s --check-prefix NOCHECKSUM

// NOCHECKSUM: !DIFile(filename: "{{.*}}code-coverage-filter1.h", directory: "{{[^"]*}}")
// NOCHECKSUM: !DIFile(filename: "{{.*}}code-coverage-filter2.h", directory: "{{[^"]*}}")
// NOCHECKSUM: !DIFile(filename: "{{.*}}debug-info-file-checksum.c", directory: "{{[^"]*}}")

// Ensure #line directives without name do emit checksums
// RUN: %clang -emit-llvm -S -g -gcodeview -x c %S/Inputs/debug-info-file-checksum-line.cpp -o - | FileCheck %s --check-prefix CHECKSUM

// CHECKSUM: !DIFile(filename: "{{.*}}debug-info-file-checksum-line.cpp", directory:{{.*}}, checksumkind: CSK_MD5, checksum: "7b568574d0e3c56c28e5e0234d1f4a06")

0 comments on commit 81d6a60

Please sign in to comment.