CPP Output: Do not emit an enter file marker for the main file.

- This diverges from gcc, and confuses tools (like dtrace) which track # line
   markers as a way to determine which content is in the context of the main
   file.

llvm-svn: 168128
This commit is contained in:
Daniel Dunbar 2012-11-16 01:51:11 +00:00
parent 08b5fef122
commit 5d38875d81
2 changed files with 15 additions and 0 deletions

View File

@ -95,6 +95,7 @@ private:
bool DisableLineMarkers;
bool DumpDefines;
bool UseLineDirective;
bool IsFirstFileEntered;
public:
PrintPPOutputPPCallbacks(Preprocessor &pp, raw_ostream &os,
bool lineMarkers, bool defines)
@ -107,6 +108,7 @@ public:
EmittedDirectiveOnThisLine = false;
FileType = SrcMgr::C_User;
Initialized = false;
IsFirstFileEntered = false;
// If we're in microsoft mode, use normal #line instead of line markers.
UseLineDirective = PP.getLangOpts().MicrosoftExt;
@ -273,6 +275,15 @@ void PrintPPOutputPPCallbacks::FileChanged(SourceLocation Loc,
Initialized = true;
}
// Do not emit an enter marker for the main file (which we expect is the first
// entered file). This matches gcc, and improves compatibility with some tools
// which track the # line markers as a way to determine when the preprocessed
// output is in the context of the main file.
if (Reason == PPCallbacks::EnterFile && !IsFirstFileEntered) {
IsFirstFileEntered = true;
return;
}
switch (Reason) {
case PPCallbacks::EnterFile:
WriteLineInfo(CurLine, " 1", 2);

View File

@ -2,6 +2,10 @@
// PR6101
int a;
// CHECK: # 1 "{{.*}}line-directive-output.c"
// Check that we do not emit an enter marker for the main file.
// CHECK-NOT: # 1 "{{.*}}line-directive-output.c" 1
// CHECK: int a;
// CHECK-NEXT: # 50 "{{.*}}line-directive-output.c"