aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorhev <wangrui@loongson.cn>2023-12-05 10:42:53 +0900
committerGitHub <noreply@github.com>2023-12-05 09:42:53 +0800
commita8874cf50bb676facb4429234dff7774e579faef (patch)
tree6be8c35a41ca83803dcbf9efc37457ab014c9945 /llvm/lib/IR
parent192439db6e3fcccf98c850bda1b970a11c590bbb (diff)
downloadllvm-a8874cf50bb676facb4429234dff7774e579faef.zip
llvm-a8874cf50bb676facb4429234dff7774e579faef.tar.gz
llvm-a8874cf50bb676facb4429234dff7774e579faef.tar.bz2
[llvm][IR] Add per-global code model attribute (#72077)
This adds a per-global code model attribute, which can override the target's code model to access global variables. Suggested-by: Arthur Eubanks <aeubanks@google.com> Link: https://discourse.llvm.org/t/how-to-best-implement-code-model-overriding-for-certain-values/71816 Link: https://discourse.llvm.org/t/rfc-add-per-global-code-model-attribute/74944
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/AsmWriter.cpp21
-rw-r--r--llvm/lib/IR/Globals.cpp11
2 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp
index fabc79a..c67c32a 100644
--- a/llvm/lib/IR/AsmWriter.cpp
+++ b/llvm/lib/IR/AsmWriter.cpp
@@ -3672,6 +3672,27 @@ void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
printEscapedString(GV->getPartition(), Out);
Out << '"';
}
+ if (auto CM = GV->getCodeModel()) {
+ Out << ", code_model \"";
+ switch (*CM) {
+ case CodeModel::Tiny:
+ Out << "tiny";
+ break;
+ case CodeModel::Small:
+ Out << "small";
+ break;
+ case CodeModel::Kernel:
+ Out << "kernel";
+ break;
+ case CodeModel::Medium:
+ Out << "medium";
+ break;
+ case CodeModel::Large:
+ Out << "large";
+ break;
+ }
+ Out << '"';
+ }
using SanitizerMetadata = llvm::GlobalValue::SanitizerMetadata;
if (GV->hasSanitizerMetadata()) {
diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp
index 7bd4503..51bdbeb 100644
--- a/llvm/lib/IR/Globals.cpp
+++ b/llvm/lib/IR/Globals.cpp
@@ -482,6 +482,8 @@ void GlobalVariable::copyAttributesFrom(const GlobalVariable *Src) {
GlobalObject::copyAttributesFrom(Src);
setExternallyInitialized(Src->isExternallyInitialized());
setAttributes(Src->getAttributes());
+ if (auto CM = Src->getCodeModel())
+ setCodeModel(*CM);
}
void GlobalVariable::dropAllReferences() {
@@ -489,6 +491,15 @@ void GlobalVariable::dropAllReferences() {
clearMetadata();
}
+void GlobalVariable::setCodeModel(CodeModel::Model CM) {
+ unsigned CodeModelData = static_cast<unsigned>(CM) + 1;
+ unsigned OldData = getGlobalValueSubClassData();
+ unsigned NewData = (OldData & ~(CodeModelMask << CodeModelShift)) |
+ (CodeModelData << CodeModelShift);
+ setGlobalValueSubClassData(NewData);
+ assert(getCodeModel() == CM && "Code model representation error!");
+}
+
//===----------------------------------------------------------------------===//
// GlobalAlias Implementation
//===----------------------------------------------------------------------===//