<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Aug 26, 2014 at 3:10 PM, Keno Fischer <span dir="ltr"><<a href="mailto:kfischer@college.harvard.edu" target="_blank">kfischer@college.harvard.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kfischer<br>
Date: Tue Aug 26 17:10:15 2014<br>
New Revision: 216495<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=216495&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=216495&view=rev</a><br>
Log:<br>
Don't segfault in EmitCXXGlobalInitFunc when main file is a membuf<br>
<br>
Summary: When the main file is created from a membuffer, there is no file entry that can be retrieved. This uses "__GLOBAL_I_a" in that case which is what was always used before r208128.<br></blockquote><div><br>
</div><div>It uses __GLOBAL_I__null_ now. Oh well :-)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Reviewers: majnemer, thakis<br>
<br>
Reviewed By: thakis<br>
<br>
Subscribers: yaron.keren, rsmith, cfe-commits<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D5043" target="_blank">http://reviews.llvm.org/D5043</a><br>
<br>
Added:<br>
    cfe/trunk/unittests/CodeGen/<br>
    cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp<br>
    cfe/trunk/unittests/CodeGen/CMakeLists.txt<br>
    cfe/trunk/unittests/CodeGen/Makefile<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGDeclCXX.cpp<br>
    cfe/trunk/unittests/CMakeLists.txt<br>
    cfe/trunk/unittests/Makefile<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=216495&r1=216494&r2=216495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=216495&r1=216494&r2=216495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Tue Aug 26 17:10:15 2014<br>
@@ -409,19 +409,25 @@ CodeGenModule::EmitCXXGlobalInitFunc() {<br>
       AddGlobalCtor(Fn, Priority);<br>
     }<br>
   }<br>
-<br>
-  // Include the filename in the symbol name. Including "sub_" matches gcc and<br>
-  // makes sure these symbols appear lexicographically behind the symbols with<br>
-  // priority emitted above.<br>
+<br>
+  SmallString<128> FileName;<br>
   SourceManager &SM = Context.getSourceManager();<br>
-  SmallString<128> FileName(llvm::sys::path::filename(<br>
-      SM.getFileEntryForID(SM.getMainFileID())->getName()));<br>
+  if (const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID())) {<br>
+    // Include the filename in the symbol name. Including "sub_" matches gcc and<br>
+    // makes sure these symbols appear lexicographically behind the symbols with<br>
+    // priority emitted above.<br>
+    FileName = llvm::sys::path::filename(MainFile->getName());<br>
+  } else {<br>
+    FileName = SmallString<128>("<null>");<br>
+  }<br>
+<br>
   for (size_t i = 0; i < FileName.size(); ++i) {<br>
     // Replace everything that's not [a-zA-Z0-9._] with a _. This set happens<br>
     // to be the set of C preprocessing numbers.<br>
     if (!isPreprocessingNumberBody(FileName[i]))<br>
       FileName[i] = '_';<br>
   }<br>
+<br>
   llvm::Function *Fn = CreateGlobalInitOrDestructFunction(<br>
       *this, FTy, llvm::Twine("_GLOBAL__sub_I_", FileName));<br>
<br>
<br>
Modified: cfe/trunk/unittests/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CMakeLists.txt?rev=216495&r1=216494&r2=216495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CMakeLists.txt?rev=216495&r1=216494&r2=216495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/CMakeLists.txt (original)<br>
+++ cfe/trunk/unittests/CMakeLists.txt Tue Aug 26 17:10:15 2014<br>
@@ -20,6 +20,7 @@ add_subdirectory(AST)<br>
 add_subdirectory(Tooling)<br>
 add_subdirectory(Format)<br>
 add_subdirectory(Sema)<br>
+add_subdirectory(CodeGen)<br>
 # FIXME: Why are the libclang unit tests disabled on Windows?<br>
 if(NOT WIN32)<br>
   add_subdirectory(libclang)<br>
<br>
Added: cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp?rev=216495&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp?rev=216495&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp (added)<br>
+++ cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp Tue Aug 26 17:10:15 2014<br>
@@ -0,0 +1,78 @@<br>
+//===- unittests/CodeGen/BufferSourceTest.cpp - MemoryBuffer source tests -===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "clang/AST/ASTConsumer.h"<br>
+#include "clang/AST/ASTContext.h"<br>
+#include "clang/AST/RecursiveASTVisitor.h"<br>
+#include "clang/Frontend/CompilerInstance.h"<br>
+#include "clang/Lex/Preprocessor.h"<br>
+#include "clang/CodeGen/ModuleBuilder.h"<br>
+#include "clang/Sema/Sema.h"<br>
+#include "clang/Parse/ParseAST.h"<br>
+#include "clang/Basic/TargetInfo.h"<br>
+#include "llvm/ADT/Triple.h"<br>
+#include "llvm/Support/Host.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
+#include "llvm/IR/LLVMContext.h"<br>
+#include "gtest/gtest.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace clang;<br>
+<br>
+namespace {<br>
+<br>
+// Emitting constructors for global objects involves looking<br>
+// at the source file name. This makes sure that we don't crash<br>
+// if the source file is a memory buffer.<br>
+const char TestProgram[] =<br>
+    "class EmitCXXGlobalInitFunc    "<br>
+    "{                              "<br>
+    "public:                        "<br>
+    "   EmitCXXGlobalInitFunc() {}  "<br>
+    "};                             "<br>
+    "EmitCXXGlobalInitFunc test;    ";<br>
+<br>
+TEST(BufferSourceTest, EmitCXXGlobalInitFunc) {<br>
+    CompilerInstance compiler;<br>
+<br>
+    compiler.createDiagnostics();<br>
+    compiler.getLangOpts().CPlusPlus = 1;<br>
+    compiler.getLangOpts().CPlusPlus11 = 1;<br>
+<br>
+    compiler.getTargetOpts().Triple = llvm::Triple::normalize(<br>
+        llvm::sys::getProcessTriple());<br>
+    compiler.setTarget(clang::TargetInfo::CreateTargetInfo(<br>
+      compiler.getDiagnostics(),<br>
+      std::make_shared<clang::TargetOptions>(<br>
+        compiler.getTargetOpts())));<br>
+<br>
+    compiler.createFileManager();<br>
+    compiler.createSourceManager(compiler.getFileManager());<br>
+    compiler.createPreprocessor(clang::TU_Prefix);<br>
+<br>
+    compiler.createASTContext();<br>
+<br>
+    compiler.setASTConsumer(std::unique_ptr<ASTConsumer>(<br>
+        CreateLLVMCodeGen(<br>
+            compiler.getDiagnostics(),<br>
+            "EmitCXXGlobalInitFuncTest",<br>
+            compiler.getCodeGenOpts(),<br>
+            compiler.getTargetOpts(),<br>
+            llvm::getGlobalContext())));<br>
+<br>
+    compiler.createSema(clang::TU_Prefix,NULL);<br>
+<br>
+    clang::SourceManager &sm = compiler.getSourceManager();<br>
+    sm.setMainFileID(sm.createFileID(<br>
+        llvm::MemoryBuffer::getMemBuffer(TestProgram), clang::SrcMgr::C_User));<br>
+<br>
+    clang::ParseAST(compiler.getSema(), false, false);<br>
+}<br>
+<br>
+}<br>
<br>
Added: cfe/trunk/unittests/CodeGen/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/CMakeLists.txt?rev=216495&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/CMakeLists.txt?rev=216495&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/CodeGen/CMakeLists.txt (added)<br>
+++ cfe/trunk/unittests/CodeGen/CMakeLists.txt Tue Aug 26 17:10:15 2014<br>
@@ -0,0 +1,17 @@<br>
+set(LLVM_LINK_COMPONENTS<br>
+  Support<br>
+  )<br>
+<br>
+add_clang_unittest(CodeGenTests<br>
+  BufferSourceTest.cpp<br>
+  )<br>
+<br>
+target_link_libraries(CodeGenTests<br>
+  clangAST<br>
+  clangBasic<br>
+  clangFrontend<br>
+  clangParse<br>
+  clangSema<br>
+  clangTooling<br>
+  clangCodeGen<br>
+  )<br>
<br>
Added: cfe/trunk/unittests/CodeGen/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/Makefile?rev=216495&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/Makefile?rev=216495&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/CodeGen/Makefile (added)<br>
+++ cfe/trunk/unittests/CodeGen/Makefile Tue Aug 26 17:10:15 2014<br>
@@ -0,0 +1,20 @@<br>
+##===- unittests/CodeGen/Makefile --------------------------*- Makefile -*-===##<br>
+#<br>
+#                     The LLVM Compiler Infrastructure<br>
+#<br>
+# This file is distributed under the University of Illinois Open Source<br>
+# License. See LICENSE.TXT for details.<br>
+#<br>
+##===----------------------------------------------------------------------===##<br>
+<br>
+CLANG_LEVEL = ../..<br>
+TESTNAME = CodeGen<br>
+include $(CLANG_LEVEL)/../../Makefile.config<br>
+LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc option<br>
+USEDLIBS = clangTooling.a clangFrontend.a clangSerialization.a clangDriver.a \<br>
+           clangRewrite.a clangRewriteFrontend.a \<br>
+           clangParse.a clangSema.a clangAnalysis.a \<br>
+           clangEdit.a clangAST.a clangASTMatchers.a clangLex.a clangBasic.a \<br>
+           clangCodeGen.a<br>
+<br>
+include $(CLANG_LEVEL)/unittests/Makefile<br>
<br>
Modified: cfe/trunk/unittests/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Makefile?rev=216495&r1=216494&r2=216495&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Makefile?rev=216495&r1=216494&r2=216495&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/unittests/Makefile (original)<br>
+++ cfe/trunk/unittests/Makefile Tue Aug 26 17:10:15 2014<br>
@@ -14,7 +14,8 @@ ifndef CLANG_LEVEL<br>
<br>
 IS_UNITTEST_LEVEL := 1<br>
 CLANG_LEVEL := ..<br>
-PARALLEL_DIRS = Basic Lex Driver libclang Format ASTMatchers AST Tooling Sema<br>
+PARALLEL_DIRS = CodeGen Basic Lex Driver libclang Format ASTMatchers AST Tooling \<br>
+               Sema<br>
<br>
 include $(CLANG_LEVEL)/../..//Makefile.config<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>