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