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

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


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
<kfischer at college.harvard.edu> wrote:
> 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