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

Keno Fischer kfischer at college.harvard.edu
Tue Aug 26 15:35:15 PDT 2014


Oh, sorry. Forgot to update the commit message.

On Tue, Aug 26, 2014 at 6:34 PM, Nico Weber <thakis at chromium.org> wrote:
> 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
>
>



More information about the cfe-commits mailing list