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
