]> granicus.if.org Git - clang/commitdiff
Make debug info work when using -save-temps.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 8 Apr 2009 05:11:16 +0000 (05:11 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 8 Apr 2009 05:11:16 +0000 (05:11 +0000)
 - This is pretty ugly, but the most obvious solution. Chime in if you
   have a nicer one.

 - The problem is that with -save-temps, clang-cc has no idea what the
   name of the original input file is. However, the user expects to be
   able to set breakpoints based on the input file name.

 - We support this by providing a new option -main-file-name (similar
   to -dumpbase used by gcc) which allows the driver to pass in the
   original file name.

 - <rdar://problem/6753383> building with clang using --save-temps
   gets the compile unit name from the .i file...

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68595 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/LangOptions.h
lib/CodeGen/CGDebugInfo.cpp
lib/Driver/Tools.cpp
tools/clang-cc/clang-cc.cpp

index f746edb65f6367a5e77ab51123f9f4f3ac4ec6ac..f95024dd8829771cc5de2b4d9769482448ac7fac 100644 (file)
@@ -76,6 +76,11 @@ private:
                    // signed.  Set/Query this value using accessors.  
   unsigned SymbolVisibility  : 3; // Symbol's visibility.
 
+  /// The user provided name for the "main file", if non-null. This is
+  /// useful in situations where the input file name does not match
+  /// the original input file, for example with -save-temps.
+  const char *MainFileName;
+
 public:  
   unsigned InstantiationDepth;    // Maximum template instantiation depth.
 
@@ -110,11 +115,16 @@ public:
     OptimizeSize = 0;
 
     PICLevel = 0;
+
+    MainFileName = 0;
   }
   
   GCMode getGCMode() const { return (GCMode) GC; }
   void setGCMode(GCMode m) { GC = (unsigned) m; }
 
+  const char *getMainFileName() const { return MainFileName; }
+  void setMainFileName(const char *Name) { MainFileName = Name; }
+
   VisibilityMode getVisibilityMode() const { return (VisibilityMode) SymbolVisibility; }
   void setVisibilityMode(VisibilityMode v) { SymbolVisibility = (unsigned) v; }
   
index c0819369b1f5e1b7009d435f461a0fe31f9a412c..45ceb2b8e6813f23055718fa46241348343d663b 100644 (file)
@@ -74,6 +74,12 @@ llvm::DICompileUnit CGDebugInfo::getOrCreateCompileUnit(SourceLocation Loc) {
   const char *DirName = FE ? FE->getDir()->getName() : "<unknown>";
   
   const LangOptions &LO = M->getLangOptions();
+
+  // If this is the main file, use the user provided main file name if
+  // specified.
+  if (isMain && LO.getMainFileName())
+    FileName = LO.getMainFileName();
+
   unsigned LangTag;
   if (LO.CPlusPlus) {
     if (LO.ObjC1)
index eb9bbf2b7b41da6ebe602cd8a1021fbf2af5f5ef..4ae96c2e6433c5dfc1427679afc89adb3ca5d186 100644 (file)
@@ -74,6 +74,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
   // The make clang go fast button.
   CmdArgs.push_back("-disable-free");
 
+  // Set the main file name, so that debug info works even with
+  // -save-temps.
+  CmdArgs.push_back("-main-file-name");
+  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
+
   if (isa<AnalyzeJobAction>(JA)) {
     // Add default argument set.
     //
index 8e396cd0c752c6607b1ad0af79a0242e9ed233bb..f2ccb80de3ce4cfeb7905e35f04a14feb86f2ad4 100644 (file)
@@ -603,6 +603,9 @@ NoCommon("fno-common",
          llvm::cl::desc("Compile common globals like normal definitions"),
          llvm::cl::ValueDisallowed);
 
+static llvm::cl::opt<std::string>
+MainFileName("main-file-name",
+             llvm::cl::desc("Main file name to use for debug info"));
 
 // It might be nice to add bounds to the CommandLine library directly.
 struct OptLevelParser : public llvm::cl::parser<unsigned> {
@@ -777,6 +780,9 @@ static void InitializeLanguageStandard(LangOptions &Options, LangKind LK,
 
   assert(PICLevel <= 2 && "Invalid value for -pic-level");
   Options.PICLevel = PICLevel;
+
+  if (MainFileName.getPosition())
+    Options.setMainFileName(MainFileName.c_str());
 }
 
 static llvm::cl::opt<bool>