Also, looks like the CMakeFiles were not quite correct. Can somebody with cmake experience have a look and tell me what to fix? Otherwise I'll revert the cmake change until then.
On Tue, Aug 26, 2014 at 6:35 PM, Keno Fischer <[email protected]> wrote: > Oh, sorry. Forgot to update the commit message. > > On Tue, Aug 26, 2014 at 6:34 PM, Nico Weber <[email protected]> wrote: >> On Tue, Aug 26, 2014 at 3:10 PM, Keno Fischer <[email protected]> >> wrote: >>> >>> Author: kfischer >>> Date: Tue Aug 26 17:10:15 2014 >>> New Revision: 216495 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=216495&view=rev >>> Log: >>> Don't segfault in EmitCXXGlobalInitFunc when main file is a membuf >>> >>> 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. >> >> >> It uses __GLOBAL_I__null_ now. Oh well :-) >> >>> >>> >>> Reviewers: majnemer, thakis >>> >>> Reviewed By: thakis >>> >>> Subscribers: yaron.keren, rsmith, cfe-commits >>> >>> Differential Revision: http://reviews.llvm.org/D5043 >>> >>> Added: >>> cfe/trunk/unittests/CodeGen/ >>> cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp >>> cfe/trunk/unittests/CodeGen/CMakeLists.txt >>> cfe/trunk/unittests/CodeGen/Makefile >>> Modified: >>> cfe/trunk/lib/CodeGen/CGDeclCXX.cpp >>> cfe/trunk/unittests/CMakeLists.txt >>> cfe/trunk/unittests/Makefile >>> >>> Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=216495&r1=216494&r2=216495&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original) >>> +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Tue Aug 26 17:10:15 2014 >>> @@ -409,19 +409,25 @@ CodeGenModule::EmitCXXGlobalInitFunc() { >>> AddGlobalCtor(Fn, Priority); >>> } >>> } >>> - >>> - // Include the filename in the symbol name. Including "sub_" matches >>> gcc and >>> - // makes sure these symbols appear lexicographically behind the symbols >>> with >>> - // priority emitted above. >>> + >>> + SmallString<128> FileName; >>> SourceManager &SM = Context.getSourceManager(); >>> - SmallString<128> FileName(llvm::sys::path::filename( >>> - SM.getFileEntryForID(SM.getMainFileID())->getName())); >>> + if (const FileEntry *MainFile = >>> SM.getFileEntryForID(SM.getMainFileID())) { >>> + // Include the filename in the symbol name. Including "sub_" matches >>> gcc and >>> + // makes sure these symbols appear lexicographically behind the >>> symbols with >>> + // priority emitted above. >>> + FileName = llvm::sys::path::filename(MainFile->getName()); >>> + } else { >>> + FileName = SmallString<128>("<null>"); >>> + } >>> + >>> for (size_t i = 0; i < FileName.size(); ++i) { >>> // Replace everything that's not [a-zA-Z0-9._] with a _. This set >>> happens >>> // to be the set of C preprocessing numbers. >>> if (!isPreprocessingNumberBody(FileName[i])) >>> FileName[i] = '_'; >>> } >>> + >>> llvm::Function *Fn = CreateGlobalInitOrDestructFunction( >>> *this, FTy, llvm::Twine("_GLOBAL__sub_I_", FileName)); >>> >>> >>> Modified: cfe/trunk/unittests/CMakeLists.txt >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CMakeLists.txt?rev=216495&r1=216494&r2=216495&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/unittests/CMakeLists.txt (original) >>> +++ cfe/trunk/unittests/CMakeLists.txt Tue Aug 26 17:10:15 2014 >>> @@ -20,6 +20,7 @@ add_subdirectory(AST) >>> add_subdirectory(Tooling) >>> add_subdirectory(Format) >>> add_subdirectory(Sema) >>> +add_subdirectory(CodeGen) >>> # FIXME: Why are the libclang unit tests disabled on Windows? >>> if(NOT WIN32) >>> add_subdirectory(libclang) >>> >>> Added: cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp?rev=216495&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp (added) >>> +++ cfe/trunk/unittests/CodeGen/BufferSourceTest.cpp Tue Aug 26 17:10:15 >>> 2014 >>> @@ -0,0 +1,78 @@ >>> +//===- unittests/CodeGen/BufferSourceTest.cpp - MemoryBuffer source tests >>> -===// >>> +// >>> +// The LLVM Compiler Infrastructure >>> +// >>> +// This file is distributed under the University of Illinois Open Source >>> +// License. See LICENSE.TXT for details. >>> +// >>> >>> +//===----------------------------------------------------------------------===// >>> + >>> +#include "clang/AST/ASTConsumer.h" >>> +#include "clang/AST/ASTContext.h" >>> +#include "clang/AST/RecursiveASTVisitor.h" >>> +#include "clang/Frontend/CompilerInstance.h" >>> +#include "clang/Lex/Preprocessor.h" >>> +#include "clang/CodeGen/ModuleBuilder.h" >>> +#include "clang/Sema/Sema.h" >>> +#include "clang/Parse/ParseAST.h" >>> +#include "clang/Basic/TargetInfo.h" >>> +#include "llvm/ADT/Triple.h" >>> +#include "llvm/Support/Host.h" >>> +#include "llvm/Support/MemoryBuffer.h" >>> +#include "llvm/IR/LLVMContext.h" >>> +#include "gtest/gtest.h" >>> + >>> +using namespace llvm; >>> +using namespace clang; >>> + >>> +namespace { >>> + >>> +// Emitting constructors for global objects involves looking >>> +// at the source file name. This makes sure that we don't crash >>> +// if the source file is a memory buffer. >>> +const char TestProgram[] = >>> + "class EmitCXXGlobalInitFunc " >>> + "{ " >>> + "public: " >>> + " EmitCXXGlobalInitFunc() {} " >>> + "}; " >>> + "EmitCXXGlobalInitFunc test; "; >>> + >>> +TEST(BufferSourceTest, EmitCXXGlobalInitFunc) { >>> + CompilerInstance compiler; >>> + >>> + compiler.createDiagnostics(); >>> + compiler.getLangOpts().CPlusPlus = 1; >>> + compiler.getLangOpts().CPlusPlus11 = 1; >>> + >>> + compiler.getTargetOpts().Triple = llvm::Triple::normalize( >>> + llvm::sys::getProcessTriple()); >>> + compiler.setTarget(clang::TargetInfo::CreateTargetInfo( >>> + compiler.getDiagnostics(), >>> + std::make_shared<clang::TargetOptions>( >>> + compiler.getTargetOpts()))); >>> + >>> + compiler.createFileManager(); >>> + compiler.createSourceManager(compiler.getFileManager()); >>> + compiler.createPreprocessor(clang::TU_Prefix); >>> + >>> + compiler.createASTContext(); >>> + >>> + compiler.setASTConsumer(std::unique_ptr<ASTConsumer>( >>> + CreateLLVMCodeGen( >>> + compiler.getDiagnostics(), >>> + "EmitCXXGlobalInitFuncTest", >>> + compiler.getCodeGenOpts(), >>> + compiler.getTargetOpts(), >>> + llvm::getGlobalContext()))); >>> + >>> + compiler.createSema(clang::TU_Prefix,NULL); >>> + >>> + clang::SourceManager &sm = compiler.getSourceManager(); >>> + sm.setMainFileID(sm.createFileID( >>> + llvm::MemoryBuffer::getMemBuffer(TestProgram), >>> clang::SrcMgr::C_User)); >>> + >>> + clang::ParseAST(compiler.getSema(), false, false); >>> +} >>> + >>> +} >>> >>> Added: cfe/trunk/unittests/CodeGen/CMakeLists.txt >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/CMakeLists.txt?rev=216495&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/unittests/CodeGen/CMakeLists.txt (added) >>> +++ cfe/trunk/unittests/CodeGen/CMakeLists.txt Tue Aug 26 17:10:15 2014 >>> @@ -0,0 +1,17 @@ >>> +set(LLVM_LINK_COMPONENTS >>> + Support >>> + ) >>> + >>> +add_clang_unittest(CodeGenTests >>> + BufferSourceTest.cpp >>> + ) >>> + >>> +target_link_libraries(CodeGenTests >>> + clangAST >>> + clangBasic >>> + clangFrontend >>> + clangParse >>> + clangSema >>> + clangTooling >>> + clangCodeGen >>> + ) >>> >>> Added: cfe/trunk/unittests/CodeGen/Makefile >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/CodeGen/Makefile?rev=216495&view=auto >>> >>> ============================================================================== >>> --- cfe/trunk/unittests/CodeGen/Makefile (added) >>> +++ cfe/trunk/unittests/CodeGen/Makefile Tue Aug 26 17:10:15 2014 >>> @@ -0,0 +1,20 @@ >>> +##===- unittests/CodeGen/Makefile --------------------------*- Makefile >>> -*-===## >>> +# >>> +# The LLVM Compiler Infrastructure >>> +# >>> +# This file is distributed under the University of Illinois Open Source >>> +# License. See LICENSE.TXT for details. >>> +# >>> >>> +##===----------------------------------------------------------------------===## >>> + >>> +CLANG_LEVEL = ../.. >>> +TESTNAME = CodeGen >>> +include $(CLANG_LEVEL)/../../Makefile.config >>> +LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc >>> option >>> +USEDLIBS = clangTooling.a clangFrontend.a clangSerialization.a >>> clangDriver.a \ >>> + clangRewrite.a clangRewriteFrontend.a \ >>> + clangParse.a clangSema.a clangAnalysis.a \ >>> + clangEdit.a clangAST.a clangASTMatchers.a clangLex.a >>> clangBasic.a \ >>> + clangCodeGen.a >>> + >>> +include $(CLANG_LEVEL)/unittests/Makefile >>> >>> Modified: cfe/trunk/unittests/Makefile >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Makefile?rev=216495&r1=216494&r2=216495&view=diff >>> >>> ============================================================================== >>> --- cfe/trunk/unittests/Makefile (original) >>> +++ cfe/trunk/unittests/Makefile Tue Aug 26 17:10:15 2014 >>> @@ -14,7 +14,8 @@ ifndef CLANG_LEVEL >>> >>> IS_UNITTEST_LEVEL := 1 >>> CLANG_LEVEL := .. >>> -PARALLEL_DIRS = Basic Lex Driver libclang Format ASTMatchers AST Tooling >>> Sema >>> +PARALLEL_DIRS = CodeGen Basic Lex Driver libclang Format ASTMatchers AST >>> Tooling \ >>> + Sema >>> >>> include $(CLANG_LEVEL)/../..//Makefile.config >>> >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> [email protected] >>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> >> _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
