r216495 - Don't segfault in EmitCXXGlobalInitFunc when main file is a membuf

Nico Weber thakis at chromium.org
Tue Aug 26 15:34:20 PDT 2014


On Tue, Aug 26, 2014 at 3:10 PM, Keno Fischer <kfischer at college.harvard.edu>
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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140826/a940d8a3/attachment.html>


More information about the cfe-commits mailing list