-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[NFCI][Globals] In GlobalObjects::setSectionPrefix, do conditional update if existing prefix is not equivalent to the new one. Returns whether prefix changed. #158460
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
887e270
314696a
b894f77
eb55b81
1df1bf5
381d31d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -289,11 +289,28 @@ void GlobalObject::setSection(StringRef S) { | |
} | ||
|
||
void GlobalObject::setSectionPrefix(StringRef Prefix) { | ||
if (Prefix.empty()) { | ||
setMetadata(LLVMContext::MD_section_prefix, nullptr); | ||
return; | ||
} | ||
MDBuilder MDB(getContext()); | ||
setMetadata(LLVMContext::MD_section_prefix, | ||
MDB.createGlobalObjectSectionPrefix(Prefix)); | ||
} | ||
|
||
bool GlobalObject::updateSectionPrefix(StringRef Prefix) { | ||
auto MD = getMetadata(LLVMContext::MD_section_prefix); | ||
|
||
StringRef ExistingPrefix; // Empty by default. | ||
if (MD != nullptr) | ||
ExistingPrefix = cast<MDString>(MD->getOperand(1))->getString(); | ||
|
||
if (ExistingPrefix != Prefix) { | ||
setSectionPrefix(Prefix); | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
std::optional<StringRef> GlobalObject::getSectionPrefix() const { | ||
if (MDNode *MD = getMetadata(LLVMContext::MD_section_prefix)) { | ||
[[maybe_unused]] StringRef MDName = | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
//===- GlobalObjectTest.cpp - Global object unit tests --------------------===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "llvm/IR/GlobalObject.h" | ||
#include "llvm-c/Core.h" | ||
|
||
#include "llvm/AsmParser/Parser.h" | ||
#include "llvm/IR/Module.h" | ||
#include "llvm/Support/SourceMgr.h" | ||
#include "gmock/gmock.h" | ||
#include "gtest/gtest.h" | ||
using namespace llvm; | ||
namespace { | ||
using testing::Eq; | ||
using testing::Optional; | ||
using testing::StrEq; | ||
|
||
static std::unique_ptr<Module> parseIR(LLVMContext &C, const char *IR) { | ||
SMDiagnostic Err; | ||
std::unique_ptr<Module> Mod = parseAssemblyString(IR, Err, C); | ||
if (!Mod) | ||
Err.print("GlobalObjectTests", errs()); | ||
return Mod; | ||
} | ||
|
||
static LLVMContext C; | ||
static std::unique_ptr<Module> M; | ||
|
||
class GlobalObjectTest : public testing::Test { | ||
public: | ||
static void SetUpTestSuite() { | ||
M = parseIR(C, R"( | ||
@foo = global i32 3, !section_prefix !0 | ||
@bar = global i32 0 | ||
!0 = !{!"section_prefix", !"hot"} | ||
)"); | ||
} | ||
}; | ||
|
||
TEST_F(GlobalObjectTest, SectionPrefix) { | ||
GlobalVariable *Foo = M->getGlobalVariable("foo"); | ||
|
||
// Initial section prefix is hot. | ||
ASSERT_NE(Foo, nullptr); | ||
ASSERT_THAT(Foo->getSectionPrefix(), Optional(StrEq("hot"))); | ||
|
||
// No actual update. | ||
EXPECT_FALSE(Foo->updateSectionPrefix("hot")); | ||
|
||
// Update prefix from hot to unlikely. | ||
Foo->setSectionPrefix("unlikely"); | ||
EXPECT_THAT(Foo->getSectionPrefix(), Optional(StrEq("unlikely"))); | ||
|
||
// Update prefix to empty is the same as clear. | ||
|
||
Foo->setSectionPrefix(""); | ||
EXPECT_THAT(Foo->getSectionPrefix(), Eq(std::nullopt)); | ||
|
||
GlobalVariable *Bar = M->getGlobalVariable("bar"); | ||
|
||
// Initial section prefix is empty. | ||
ASSERT_NE(Bar, nullptr); | ||
ASSERT_THAT(Bar->getSectionPrefix(), Eq(std::nullopt)); | ||
|
||
// No actual update. | ||
EXPECT_FALSE(Bar->updateSectionPrefix("")); | ||
snehasish marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
||
// Update from empty to hot. | ||
EXPECT_TRUE(Bar->updateSectionPrefix("hot")); | ||
EXPECT_THAT(Bar->getSectionPrefix(), Optional(StrEq("hot"))); | ||
} | ||
} // namespace |
Uh oh!
There was an error while loading. Please reload this page.