Skip to content

Commit

Permalink
[GlobalObject] Fix setSection("")
Browse files Browse the repository at this point in the history
Summary:
In rL291613, the section name was interned in LLVMContext. However,
this broke the ability to remove the section from a GlobalObject,
because it tried to intern empty strings, which is not allowed.
Fix that and add an appropriate regression test.

Reviewed By: rnk
Differential Revision: https://reviews.llvm.org/D29795

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295238 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Keno committed Feb 15, 2017
1 parent 75af20e commit b863b6b
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/IR/Globals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,9 @@ void GlobalObject::setSection(StringRef S) {

// Get or create a stable section name string and put it in the table in the
// context.
S = getContext().pImpl->SectionStrings.insert(S).first->first();
if (!S.empty()) {
S = getContext().pImpl->SectionStrings.insert(S).first->first();
}
getContext().pImpl->GlobalObjectSections[this] = S;

// Update the HasSectionHashEntryBit. Setting the section to the empty string
Expand Down
21 changes: 21 additions & 0 deletions unittests/IR/FunctionTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//

#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "gtest/gtest.h"
using namespace llvm;

Expand Down Expand Up @@ -109,4 +110,24 @@ TEST(FunctionTest, stealArgumentListFrom) {
EXPECT_TRUE(F2->hasLazyArguments());
}

// Test setting and removing section information
TEST(FunctionTest, setSection) {
LLVMContext C;
Module M("test", C);

llvm::Function *F =
Function::Create(llvm::FunctionType::get(llvm::Type::getVoidTy(C), false),
llvm::GlobalValue::ExternalLinkage, "F", &M);

F->setSection(".text.test");
EXPECT_TRUE(F->getSection() == ".text.test");
EXPECT_TRUE(F->hasSection());
F->setSection("");
EXPECT_FALSE(F->hasSection());
F->setSection(".text.test");
F->setSection(".text.test2");
EXPECT_TRUE(F->getSection() == ".text.test2");
EXPECT_TRUE(F->hasSection());
}

} // end namespace

0 comments on commit b863b6b

Please sign in to comment.