diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 57214bb8854c8..77df04859f2f8 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -2892,16 +2892,16 @@ def CHERILibCall : DeclOrTypeAttr { let Subjects = SubjectList<[Function], ErrorDiag>; } -def CHERIOTMMIODevice : DeclOrTypeAttr { +def CHERIoTMMIODevice : DeclOrTypeAttr { let Spellings = [GNU<"cheriot_mmio">]; - let Documentation = [CHERIOTMMIODeviceDocs]; + let Documentation = [CHERIoTMMIODeviceDocs]; let Args = [StringArgument<"DeviceName">, StringArgument<"EncodedPermissions", 1>]; let Subjects = SubjectList<[GlobalVar], ErrorDiag>; } -def CHERIOTSharedObject : DeclOrTypeAttr { +def CHERIoTSharedObject : DeclOrTypeAttr { let Spellings = [GNU<"cheriot_shared_object">]; - let Documentation = [CHERIOTSharedObjectDocs]; + let Documentation = [CHERIoTSharedObjectDocs]; let Args = [StringArgument<"ObjectName">, StringArgument<"EncodedPermissions", 1>]; let Subjects = SubjectList<[GlobalVar], ErrorDiag>; } diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td index 61eb592754eda..f007c8d0fa653 100644 --- a/clang/include/clang/Basic/AttrDocs.td +++ b/clang/include/clang/Basic/AttrDocs.td @@ -1473,7 +1473,7 @@ Further reading for other annotations: }]; } -def CHERIOTMMIODeviceDocs : Documentation { +def CHERIoTMMIODeviceDocs : Documentation { let Category = DocCatVariable; let Content = [{ Indicates that the global it refers to must be treated as a cross-compartment @@ -1486,7 +1486,7 @@ qualifiers. of the MMIO-bound device. An example of this is ``"uart"``. The ``""`` indicates the permissions of the capability resulting from the import. The permissions encoding is a string of variable -length. The symbols allowed in the string are ``R``, ``W``, ``c`` and ``m``, +length. The symbols allowed in the string are ``R``, ``W``, ``c``, ``m`` and ``g``, whose meaning is explained in the table below. @@ -1496,18 +1496,19 @@ whose meaning is explained in the table below. "``R``","Load (Read)", "May be used to read.","" "``W``","Store (Write)", "May be used to write.","" "``c``","Load / Store Capability", "May be used to load or store capabilities as well as non-capability data.","``R`` or ``W``" - "``m``","Load Mutable", "May be used to load capabilities with write permission.","``R``" + "``m``","Load Mutable", "May be used to load capabilities with write permission.","``R`` and ``c``" + "``g``","Load Global", " May be used to load capabilities with the global permission.","``R`` and ``c``" Examples of valid encodings are: ``"RWcm"`` (all permissions), ``"R"`` (read only), etc. Note that the order in which symbols appear is not relevant: for example, `"RWcm"` and `"mcWR"` are both valid and entail the same permissions. -**Warning**: The ```` parameter is optional, and if no encoding is given ``"RWcm"`` is assumed. +**Warning**: The ```` parameter is optional, and if no encoding is given ``"RWcmg"`` is assumed. }]; } -def CHERIOTSharedObjectDocs : Documentation { +def CHERIoTSharedObjectDocs : Documentation { let Category = DocCatVariable; let Content = [{ Indicates that the global it refers to must be treated as a cross-compartment @@ -1521,7 +1522,7 @@ cross-compartment shared object. The target global must have the `extern` and of the shared object. The ``""`` indicates the permissions of the capability resulting from the import. The permissions encoding is a string of variable length. The symbols allowed in the string are ``R``, ``W``, -``c`` and ``m``, whose meaning is explained in the table below. +``c``, ``m`` and ``g``, whose meaning is explained in the table below. .. csv-table:: Supported Syntaxes @@ -1530,13 +1531,14 @@ string of variable length. The symbols allowed in the string are ``R``, ``W``, "``R``","Load (Read)", "May be used to read.","" "``W``","Store (Write)", "May be used to write.","" "``c``","Load / Store Capability", "May be used to load or store capabilities as well as non-capability data.","``R`` or ``W``" - "``m``","Load Mutable", "May be used to load capabilities with write permission.","``R``" + "``m``","Load Mutable", "May be used to load capabilities with write permission.","``R`` and ``c``" + "``g``","Load Global", " May be used to load capabilities with the global permission.","``R`` and ``c``" Examples of valid encodings are: ``"RWcm"`` (all permissions), ``"R"`` (read only), etc. Note that the order in which symbols appear is not relevant: for example, `"RWcm"` and `"mcWR"` are both valid and entail the same permissions. -**Warning**: The ```` parameter is optional, and if no encoding is given ``"RWcm"`` is assumed. +**Warning**: The ```` parameter is optional, and if no encoding is given ``"RWcmg"`` is assumed. }]; } diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index 599aa40eb935e..7038f4d56c4c2 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -2106,10 +2106,10 @@ void TypePrinter::printAttributedAfter(const AttributedType *T, case attr::CHERILibCall: OS << "cheri_libcall"; break; - case attr::CHERIOTMMIODevice: + case attr::CHERIoTMMIODevice: OS << "cheriot_mmio"; break; - case attr::CHERIOTSharedObject: + case attr::CHERIoTSharedObject: OS << "cheriot_shared_object"; break; case attr::CHERIoTSealedType: diff --git a/clang/lib/CodeGen/Targets/RISCV.cpp b/clang/lib/CodeGen/Targets/RISCV.cpp index 2b0e6e1cd848e..d8c59179ba96d 100644 --- a/clang/lib/CodeGen/Targets/RISCV.cpp +++ b/clang/lib/CodeGen/Targets/RISCV.cpp @@ -667,8 +667,8 @@ class RISCVTargetCodeGenInfo : public CommonCheriTargetCodeGenInfo { // `cheriot_cap_import` attribute in the generated LLVM IR, so that the // back-end can generate the proper import entries and correctly // translate references to this global. - if (VD->hasAttr()) { - auto *Attr = D->getAttr(); + if (VD->hasAttr()) { + auto *Attr = D->getAttr(); llvm::CHERIoTGlobalCapabilityImportAttr CapImportAttr( llvm::CHERIoTGlobalCapabilityImportAttr::MMIO, Attr->getDeviceName(), Attr->getEncodedPermissions()); @@ -676,8 +676,8 @@ class RISCVTargetCodeGenInfo : public CommonCheriTargetCodeGenInfo { } // Same for the `cheriot_shared_object(...)` attribute. - if (VD->hasAttr()) { - auto *Attr = D->getAttr(); + if (VD->hasAttr()) { + auto *Attr = D->getAttr(); llvm::CHERIoTGlobalCapabilityImportAttr CapImportAttr( llvm::CHERIoTGlobalCapabilityImportAttr::SharedObject, Attr->getObjectName(), Attr->getEncodedPermissions()); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 19d1963e97aea..149e11ec9da1a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -13504,14 +13504,14 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) { // CHERIoT-specific check: if the decl has the `cheriot_mmio` or // `cheriot_shared_object` attributes and also has an explicit definition, an // error must be generated. - if (RealDecl->hasAttr() || - RealDecl->hasAttr()) { + if (RealDecl->hasAttr() || + RealDecl->hasAttr()) { const IdentifierInfo *AttrName; - if (auto *Attr = RealDecl->getAttr()) + if (auto *Attr = RealDecl->getAttr()) AttrName = Attr->getAttrName(); else { - AttrName = RealDecl->getAttr()->getAttrName(); + AttrName = RealDecl->getAttr()->getAttrName(); } Diag(RealDecl->getLocation(), diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 5f627c0440729..c74cff3fe4f64 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -2106,7 +2106,7 @@ static void handleCHERIMethodSuffix(Sema &S, Decl *D, const ParsedAttr &Attr) { D->addAttr(::new (S.Context) CHERIMethodSuffixAttr(S.Context, Attr, Str)); } -static void handleCHERIOTMMIODevice(Sema &S, Decl *D, const ParsedAttr &Attr, +static void handleCHERIoTMMIODevice(Sema &S, Decl *D, const ParsedAttr &Attr, Sema::DeclAttributeLocation DAL) { auto *VD = dyn_cast(D); if (!VD || !VD->hasGlobalStorage()) @@ -2166,11 +2166,11 @@ static void handleCHERIOTMMIODevice(Sema &S, Decl *D, const ParsedAttr &Attr, FailedSemanticCheckCallback)) return; - return D->addAttr(::new (S.Context) CHERIOTMMIODeviceAttr( + return D->addAttr(::new (S.Context) CHERIoTMMIODeviceAttr( S.Context, Attr, DeviceName, OwnedPermissions)); } -static void handleCHERIOTSharedObject(Sema &S, Decl *D, const ParsedAttr &Attr, +static void handleCHERIoTSharedObject(Sema &S, Decl *D, const ParsedAttr &Attr, Sema::DeclAttributeLocation DAL) { auto *VD = dyn_cast(D); if (!VD || !VD->hasGlobalStorage()) @@ -2226,7 +2226,7 @@ static void handleCHERIOTSharedObject(Sema &S, Decl *D, const ParsedAttr &Attr, FailedSemanticCheckCallback)) return; - D->addAttr(::new (S.Context) CHERIOTSharedObjectAttr( + D->addAttr(::new (S.Context) CHERIoTSharedObjectAttr( S.Context, Attr, ObjectName, OwnedPermissions)); } @@ -7501,11 +7501,11 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL, case ParsedAttr::AT_CHERICompartmentName: handleCHERICompartmentName(S, D, AL, DAL); break; - case ParsedAttr::AT_CHERIOTMMIODevice: - handleCHERIOTMMIODevice(S, D, AL, DAL); + case ParsedAttr::AT_CHERIoTMMIODevice: + handleCHERIoTMMIODevice(S, D, AL, DAL); break; - case ParsedAttr::AT_CHERIOTSharedObject: - handleCHERIOTSharedObject(S, D, AL, DAL); + case ParsedAttr::AT_CHERIoTSharedObject: + handleCHERIoTSharedObject(S, D, AL, DAL); break; case ParsedAttr::AT_CHERIoTSealedType: handleCHERIoTSealedType(S, D, AL, DAL); diff --git a/clang/test/CodeGen/cheri/riscv/cheriot-cap-import-attr.c b/clang/test/CodeGen/cheri/riscv/cheriot-cap-import-attr.c index 5bd40b3bc3a94..7f68d59e2cf70 100644 --- a/clang/test/CodeGen/cheri/riscv/cheriot-cap-import-attr.c +++ b/clang/test/CodeGen/cheri/riscv/cheriot-cap-import-attr.c @@ -2,189 +2,232 @@ struct Uart {}; -// No specific perm encoding means "RWcm". +// No specific perm encoding means "RWcmg". // CHECK: @uart = external addrspace(200) global %struct.Uart, align 1 #0 __attribute__((cheriot_mmio("uart"))) extern volatile struct Uart uart; -// CHECK: @uart1 = external addrspace(200) global %struct.Uart, align 1 #0 -__attribute__((cheriot_mmio("uart", "WcmR"))) volatile struct Uart uart1; +// CHECK: @uart_WcmRg = external addrspace(200) global %struct.Uart, align 1 #0 +__attribute__((cheriot_mmio("uart", "WcmRg"))) volatile struct Uart uart_WcmRg; -// CHECK: @uart2 = external addrspace(200) global %struct.Uart, align 1 #0 -__attribute__((cheriot_mmio("uart", "cmRW"))) volatile struct Uart uart2; +// CHECK: @uart_cmRWg = external addrspace(200) global %struct.Uart, align 1 #0 +__attribute__((cheriot_mmio("uart", "cmRWg"))) volatile struct Uart uart_cmRWg; -// CHECK: @uart3 = external addrspace(200) global %struct.Uart, align 1 #0 -__attribute__((cheriot_mmio("uart", "RmcW"))) volatile struct Uart uart3; +// CHECK: @uart_RmcWg = external addrspace(200) global %struct.Uart, align 1 #0 +__attribute__((cheriot_mmio("uart", "RmcWg"))) volatile struct Uart uart_RmcWg; -// CHECK: @uart4 = external addrspace(200) global %struct.Uart, align 1 #0 -__attribute__((cheriot_mmio("uart", "RmcW"))) volatile struct Uart uart4; +// CHECK: @uart_RmcWg2 = external addrspace(200) global %struct.Uart, align 1 #0 +__attribute__((cheriot_mmio("uart", "RmcWg"))) volatile struct Uart uart_RmcWg2; // CHECK: @SO = external addrspace(200) global i32, align 4 #1 __attribute__((cheriot_shared_object("SO"))) int SO; -// CHECK: @SO1 = external addrspace(200) global i32, align 4 #1 -__attribute__((cheriot_shared_object("SO", "RWcm"))) extern int SO1; +// CHECK: @SO_RWcmg = external addrspace(200) global i32, align 4 #1 +__attribute__((cheriot_shared_object("SO", "RWcmg"))) extern int SO_RWcmg; -// CHECK: @SO2 = external addrspace(200) global i32, align 4 #1 -__attribute__((cheriot_shared_object("SO", "RWmc"))) extern int SO2; +// CHECK: @SO_RWmcg = external addrspace(200) global i32, align 4 #1 +__attribute__((cheriot_shared_object("SO", "RWmcg"))) extern int SO_RWmcg; -// CHECK: @SO3 = external addrspace(200) global i32, align 4 #1 -__attribute__((cheriot_shared_object("SO", "RmcW"))) extern int SO3; +// CHECK: @SO_RmcWg = external addrspace(200) global i32, align 4 #1 +__attribute__((cheriot_shared_object("SO", "RmcWg"))) extern int SO_RmcWg; -// CHECK: @SO4 = external addrspace(200) global i32, align 4 #1 -__attribute__((cheriot_shared_object("SO", "mRcW"))) extern int SO4; +// CHECK: @SO_mRcWg = external addrspace(200) global i32, align 4 #1 +__attribute__((cheriot_shared_object("SO", "mRcWg"))) extern int SO_mRcWg; -// CHECK: @uart5 = external addrspace(200) global %struct.Uart, align 1 #2 -__attribute__((cheriot_mmio("uart", "R"))) extern volatile struct Uart uart5; +// CHECK: @uart_R = external addrspace(200) global %struct.Uart, align 1 #2 +__attribute__((cheriot_mmio("uart", "R"))) extern volatile struct Uart uart_R; -// CHECK: @uart6 = external addrspace(200) global %struct.Uart, align 1 #3 -__attribute__((cheriot_mmio("uart", "Rc"))) extern volatile struct Uart uart6; +// CHECK: @uart_Rc = external addrspace(200) global %struct.Uart, align 1 #3 +__attribute__((cheriot_mmio("uart", "Rc"))) extern volatile struct Uart uart_Rc; -// CHECK: @uart61 = external addrspace(200) global %struct.Uart, align 1 #3 -__attribute__((cheriot_mmio("uart", "cR"))) extern volatile struct Uart uart61; +// CHECK: @uart_cR = external addrspace(200) global %struct.Uart, align 1 #3 +__attribute__((cheriot_mmio("uart", "cR"))) extern volatile struct Uart uart_cR; -// CHECK: @uart7 = external addrspace(200) global %struct.Uart, align 1 #4 -__attribute__((cheriot_mmio("uart", "Rcm"))) extern volatile struct Uart uart7; +// CHECK: @uart_Rcm = external addrspace(200) global %struct.Uart, align 1 #4 +__attribute__((cheriot_mmio("uart", "Rcm"))) extern volatile struct Uart uart_Rcm; -// CHECK: @uart71 = external addrspace(200) global %struct.Uart, align 1 #4 -__attribute__((cheriot_mmio("uart", "cRm"))) extern volatile struct Uart uart71; +// CHECK: @uart_cRm = external addrspace(200) global %struct.Uart, align 1 #4 +__attribute__((cheriot_mmio("uart", "cRm"))) extern volatile struct Uart uart_cRm; -// CHECK: @uart72 = external addrspace(200) global %struct.Uart, align 1 #4 -__attribute__((cheriot_mmio("uart", "cmR"))) extern volatile struct Uart uart72; +// CHECK: @uart_cmR = external addrspace(200) global %struct.Uart, align 1 #4 +__attribute__((cheriot_mmio("uart", "cmR"))) extern volatile struct Uart uart_cmR; -// CHECK: @uart73 = external addrspace(200) global %struct.Uart, align 1 #4 -__attribute__((cheriot_mmio("uart", "mRc"))) extern volatile struct Uart uart73; +// CHECK: @uart_mRc = external addrspace(200) global %struct.Uart, align 1 #4 +__attribute__((cheriot_mmio("uart", "mRc"))) extern volatile struct Uart uart_mRc; -// CHECK: @uart8 = external addrspace(200) global %struct.Uart, align 1 #5 -__attribute__((cheriot_mmio("uart", "W"))) extern volatile struct Uart uart8; +// CHECK: @uart_W = external addrspace(200) global %struct.Uart, align 1 #5 +__attribute__((cheriot_mmio("uart", "W"))) extern volatile struct Uart uart_W; -// CHECK: @uart9 = external addrspace(200) global %struct.Uart, align 1 #6 -__attribute__((cheriot_mmio("uart", "Wc"))) extern volatile struct Uart uart9; +// CHECK: @uart_Wc = external addrspace(200) global %struct.Uart, align 1 #6 +__attribute__((cheriot_mmio("uart", "Wc"))) extern volatile struct Uart uart_Wc; -// CHECK: @uart91 = external addrspace(200) global %struct.Uart, align 1 #6 -__attribute__((cheriot_mmio("uart", "cW"))) extern volatile struct Uart uart91; +// CHECK: @uart_cW = external addrspace(200) global %struct.Uart, align 1 #6 +__attribute__((cheriot_mmio("uart", "cW"))) extern volatile struct Uart uart_cW; -// CHECK: @uart10 = external addrspace(200) global %struct.Uart, align 1 #7 -__attribute__((cheriot_mmio("uart", "RWc"))) extern volatile struct Uart uart10; +// CHECK: @uart_RWc = external addrspace(200) global %struct.Uart, align 1 #7 +__attribute__((cheriot_mmio("uart", "RWc"))) extern volatile struct Uart uart_RWc; -// CHECK: @uart101 = external addrspace(200) global %struct.Uart, align 1 #7 -__attribute__((cheriot_mmio("uart", "cRW"))) extern volatile struct Uart uart101; +// CHECK: @uart_cRW = external addrspace(200) global %struct.Uart, align 1 #7 +__attribute__((cheriot_mmio("uart", "cRW"))) extern volatile struct Uart uart_cRW; -// CHECK: @uart102 = external addrspace(200) global %struct.Uart, align 1 #7 -__attribute__((cheriot_mmio("uart", "RcW"))) extern volatile struct Uart uart102; +// CHECK: @uart_RcW = external addrspace(200) global %struct.Uart, align 1 #7 +__attribute__((cheriot_mmio("uart", "RcW"))) extern volatile struct Uart uart_RcW; -// CHECK: @uart103 = external addrspace(200) global %struct.Uart, align 1 #7 -__attribute__((cheriot_mmio("uart", "WRc"))) extern volatile struct Uart uart103; +// CHECK: @uart_WRc = external addrspace(200) global %struct.Uart, align 1 #7 +__attribute__((cheriot_mmio("uart", "WRc"))) extern volatile struct Uart uart_WRc; -// CHECK: @uart104 = external addrspace(200) global %struct.Uart, align 1 #7 -__attribute__((cheriot_mmio("uart", "WcR"))) extern volatile struct Uart uart104; +// CHECK: @uart_WcR = external addrspace(200) global %struct.Uart, align 1 #7 +__attribute__((cheriot_mmio("uart", "WcR"))) extern volatile struct Uart uart_WcR; -// CHECK: @SO5 = external addrspace(200) global i32, align 4 #8 -__attribute__((cheriot_shared_object("SO", "R"))) extern int SO5; +// CHECK: @uart_Rcg = external addrspace(200) global %struct.Uart, align 1 #8 +__attribute__((cheriot_mmio("uart", "Rcg"))) extern volatile struct Uart uart_Rcg; -// CHECK: @SO6 = external addrspace(200) global i32, align 4 #9 -__attribute__((cheriot_shared_object("SO", "Rc"))) extern int SO6; +// CHECK: @uart_cRg = external addrspace(200) global %struct.Uart, align 1 #8 +__attribute__((cheriot_mmio("uart", "cRg"))) extern volatile struct Uart uart_cRg; -// CHECK: @SO61 = external addrspace(200) global i32, align 4 #9 -__attribute__((cheriot_shared_object("SO", "cR"))) extern int SO61; +// CHECK: @uart_cgR = external addrspace(200) global %struct.Uart, align 1 #8 +__attribute__((cheriot_mmio("uart", "cgR"))) extern volatile struct Uart uart_cgR; -// CHECK: @SO7 = external addrspace(200) global i32, align 4 #10 -__attribute__((cheriot_shared_object("SO", "Rcm"))) extern int SO7; +// CHECK: @uart_gcR = external addrspace(200) global %struct.Uart, align 1 #8 +__attribute__((cheriot_mmio("uart", "gcR"))) extern volatile struct Uart uart_gcR; -// CHECK: @SO71 = external addrspace(200) global i32, align 4 #10 -__attribute__((cheriot_shared_object("SO", "cRm"))) extern int SO71; +// CHECK: @uart_gRc = external addrspace(200) global %struct.Uart, align 1 #8 +__attribute__((cheriot_mmio("uart", "gcR"))) extern volatile struct Uart uart_gRc; -// CHECK: @SO72 = external addrspace(200) global i32, align 4 #10 -__attribute__((cheriot_shared_object("SO", "cmR"))) extern int SO72; +// CHECK: @SO_R = external addrspace(200) global i32, align 4 #9 +__attribute__((cheriot_shared_object("SO", "R"))) extern int SO_R; -// CHECK: @SO73 = external addrspace(200) global i32, align 4 #10 -__attribute__((cheriot_shared_object("SO", "mRc"))) extern int SO73; +// CHECK: @SO_Rc = external addrspace(200) global i32, align 4 #10 +__attribute__((cheriot_shared_object("SO", "Rc"))) extern int SO_Rc; -// CHECK: @SO8 = external addrspace(200) global i32, align 4 #11 -__attribute__((cheriot_shared_object("SO", "W"))) extern int SO8; +// CHECK: @SO_cR = external addrspace(200) global i32, align 4 #10 +__attribute__((cheriot_shared_object("SO", "cR"))) extern int SO_cR; -// CHECK: @SO9 = external addrspace(200) global i32, align 4 #12 -__attribute__((cheriot_shared_object("SO", "Wc"))) extern int SO9; +// CHECK: @SO_Rcm = external addrspace(200) global i32, align 4 #11 +__attribute__((cheriot_shared_object("SO", "Rcm"))) extern int SO_Rcm; -// CHECK: @SO91 = external addrspace(200) global i32, align 4 #12 -__attribute__((cheriot_shared_object("SO", "cW"))) extern int SO91; +// CHECK: @SO_cRm = external addrspace(200) global i32, align 4 #11 +__attribute__((cheriot_shared_object("SO", "cRm"))) extern int SO_cRm; -// CHECK: @SO10 = external addrspace(200) global i32, align 4 #13 -__attribute__((cheriot_shared_object("SO", "RWc"))) extern int SO10; +// CHECK: @SO_cmR = external addrspace(200) global i32, align 4 #11 +__attribute__((cheriot_shared_object("SO", "cmR"))) extern int SO_cmR; -// CHECK: @SO101 = external addrspace(200) global i32, align 4 #13 -__attribute__((cheriot_shared_object("SO", "cRW"))) extern int SO101; +// CHECK: @SO_mRc = external addrspace(200) global i32, align 4 #11 +__attribute__((cheriot_shared_object("SO", "mRc"))) extern int SO_mRc; -// CHECK: @SO102 = external addrspace(200) global i32, align 4 #13 -__attribute__((cheriot_shared_object("SO", "RcW"))) extern int SO102; +// CHECK: @SO_W = external addrspace(200) global i32, align 4 #12 +__attribute__((cheriot_shared_object("SO", "W"))) extern int SO_W; -// CHECK: @SO103 = external addrspace(200) global i32, align 4 #13 -__attribute__((cheriot_shared_object("SO", "WRc"))) extern int SO103; +// CHECK: @SO_Wc = external addrspace(200) global i32, align 4 #13 +__attribute__((cheriot_shared_object("SO", "Wc"))) extern int SO_Wc; -// CHECK: @SO104 = external addrspace(200) global i32, align 4 #13 -__attribute__((cheriot_shared_object("SO", "WcR"))) extern int SO104; +// CHECK: @SO_cW = external addrspace(200) global i32, align 4 #13 +__attribute__((cheriot_shared_object("SO", "cW"))) extern int SO_cW; + +// CHECK: @SO_RWc = external addrspace(200) global i32, align 4 #14 +__attribute__((cheriot_shared_object("SO", "RWc"))) extern int SO_RWc; + +// CHECK: @SO_cRW = external addrspace(200) global i32, align 4 #14 +__attribute__((cheriot_shared_object("SO", "cRW"))) extern int SO_cRW; + +// CHECK: @SO_RcW = external addrspace(200) global i32, align 4 #14 +__attribute__((cheriot_shared_object("SO", "RcW"))) extern int SO_RcW; + +// CHECK: @SO_WRc = external addrspace(200) global i32, align 4 #14 +__attribute__((cheriot_shared_object("SO", "WRc"))) extern int SO_WRc; + +// CHECK: @SO_WcR = external addrspace(200) global i32, align 4 #14 +__attribute__((cheriot_shared_object("SO", "WcR"))) extern int SO_WcR; + +// CHECK: @SO_Rcg = external addrspace(200) global i32, align 4 #15 +__attribute__((cheriot_shared_object("SO", "Rcg"))) extern int SO_Rcg; + +// CHECK: @SO_cRg = external addrspace(200) global i32, align 4 #15 +__attribute__((cheriot_shared_object("SO", "cRg"))) extern int SO_cRg; + +// CHECK: @SO_cgR = external addrspace(200) global i32, align 4 #15 +__attribute__((cheriot_shared_object("SO", "cgR"))) extern int SO_cgR; + +// CHECK: @SO_gcR = external addrspace(200) global i32, align 4 #15 +__attribute__((cheriot_shared_object("SO", "gcR"))) extern int SO_gcR; + +// CHECK: @SO_gRc = external addrspace(200) global i32, align 4 #15 +__attribute__((cheriot_shared_object("SO", "gcR"))) extern int SO_gRc; void doSomethingWithUart(volatile struct Uart *uart); void doSomethingWithSO(int *SO); void func() { doSomethingWithUart(&uart); - doSomethingWithUart(&uart1); - doSomethingWithUart(&uart2); - doSomethingWithUart(&uart3); - doSomethingWithUart(&uart4); + doSomethingWithUart(&uart_WcmRg); + doSomethingWithUart(&uart_cmRWg); + doSomethingWithUart(&uart_RmcWg); + doSomethingWithUart(&uart_RmcWg2); doSomethingWithSO(&SO); - doSomethingWithSO(&SO1); - doSomethingWithSO(&SO2); - doSomethingWithSO(&SO3); - doSomethingWithSO(&SO4); - - doSomethingWithUart(&uart5); - doSomethingWithUart(&uart6); - doSomethingWithUart(&uart61); - doSomethingWithUart(&uart7); - doSomethingWithUart(&uart71); - doSomethingWithUart(&uart72); - doSomethingWithUart(&uart73); - doSomethingWithUart(&uart8); - doSomethingWithUart(&uart9); - doSomethingWithUart(&uart91); - doSomethingWithUart(&uart10); - doSomethingWithUart(&uart101); - doSomethingWithUart(&uart102); - doSomethingWithUart(&uart103); - doSomethingWithUart(&uart104); - - doSomethingWithSO(&SO5); - doSomethingWithSO(&SO6); - doSomethingWithSO(&SO61); - doSomethingWithSO(&SO7); - doSomethingWithSO(&SO71); - doSomethingWithSO(&SO72); - doSomethingWithSO(&SO73); - doSomethingWithSO(&SO8); - doSomethingWithSO(&SO9); - doSomethingWithSO(&SO91); - doSomethingWithSO(&SO10); - doSomethingWithSO(&SO101); - doSomethingWithSO(&SO102); - doSomethingWithSO(&SO103); - doSomethingWithSO(&SO104); - + doSomethingWithSO(&SO_RWcmg); + doSomethingWithSO(&SO_RWmcg); + doSomethingWithSO(&SO_RmcWg); + doSomethingWithSO(&SO_mRcWg); + + doSomethingWithUart(&uart_R); + doSomethingWithUart(&uart_Rc); + doSomethingWithUart(&uart_cR); + doSomethingWithUart(&uart_Rcm); + doSomethingWithUart(&uart_cRm); + doSomethingWithUart(&uart_cmR); + doSomethingWithUart(&uart_mRc); + doSomethingWithUart(&uart_W); + doSomethingWithUart(&uart_Wc); + doSomethingWithUart(&uart_cW); + doSomethingWithUart(&uart_RWc); + doSomethingWithUart(&uart_cRW); + doSomethingWithUart(&uart_RcW); + doSomethingWithUart(&uart_WRc); + doSomethingWithUart(&uart_WcR); + doSomethingWithUart(&uart_Rcg); + doSomethingWithUart(&uart_cRg); + doSomethingWithUart(&uart_cgR); + doSomethingWithUart(&uart_gcR); + doSomethingWithUart(&uart_gRc); + + doSomethingWithSO(&SO_R); + doSomethingWithSO(&SO_Rc); + doSomethingWithSO(&SO_cR); + doSomethingWithSO(&SO_Rcm); + doSomethingWithSO(&SO_cRm); + doSomethingWithSO(&SO_cmR); + doSomethingWithSO(&SO_mRc); + doSomethingWithSO(&SO_W); + doSomethingWithSO(&SO_Wc); + doSomethingWithSO(&SO_cW); + doSomethingWithSO(&SO_RWc); + doSomethingWithSO(&SO_cRW); + doSomethingWithSO(&SO_RcW); + doSomethingWithSO(&SO_cW); + doSomethingWithSO(&SO_WRc); + doSomethingWithSO(&SO_WcR); + doSomethingWithSO(&SO_WcR); + doSomethingWithSO(&SO_Rcg); + doSomethingWithSO(&SO_cRg); + doSomethingWithSO(&SO_cgR); + doSomethingWithSO(&SO_gcR); + doSomethingWithSO(&SO_gRc); } -// CHECK: attributes #0 = { "cheriot_global_cap_import"="mem,uart,RWcm" } -// CHECK: attributes #1 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,RWcm" } -// CHECK: attributes #2 = { "cheriot_global_cap_import"="mem,uart,R---" } -// CHECK: attributes #3 = { "cheriot_global_cap_import"="mem,uart,R-c-" } -// CHECK: attributes #4 = { "cheriot_global_cap_import"="mem,uart,R-cm" } -// CHECK: attributes #5 = { "cheriot_global_cap_import"="mem,uart,-W--" } -// CHECK: attributes #6 = { "cheriot_global_cap_import"="mem,uart,-Wc-" } -// CHECK: attributes #7 = { "cheriot_global_cap_import"="mem,uart,RWc-" } -// CHECK: attributes #8 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R---" } -// CHECK: attributes #9 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R-c-" } -// CHECK: attributes #10 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R-cm" } -// CHECK: attributes #11 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,-W--" } -// CHECK: attributes #12 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,-Wc-" } -// CHECK: attributes #13 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,RWc-" } +// CHECK: attributes #0 = { "cheriot_global_cap_import"="mem,uart,RWcmg" } +// CHECK: attributes #1 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,RWcmg" } +// CHECK: attributes #2 = { "cheriot_global_cap_import"="mem,uart,R----" } +// CHECK: attributes #3 = { "cheriot_global_cap_import"="mem,uart,R-c--" } +// CHECK: attributes #4 = { "cheriot_global_cap_import"="mem,uart,R-cm-" } +// CHECK: attributes #5 = { "cheriot_global_cap_import"="mem,uart,-W---" } +// CHECK: attributes #6 = { "cheriot_global_cap_import"="mem,uart,-Wc--" } +// CHECK: attributes #7 = { "cheriot_global_cap_import"="mem,uart,RWc--" } +// CHECK: attributes #8 = { "cheriot_global_cap_import"="mem,uart,R-c-g" } +// CHECK: attributes #9 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R----" } +// CHECK: attributes #10 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R-c--" } +// CHECK: attributes #11 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R-cm-" } +// CHECK: attributes #12 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,-W---" } +// CHECK: attributes #13 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,-Wc--" } +// CHECK: attributes #14 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,RWc--" } +// CHECK: attributes #15 = { "cheriot_global_cap_import"="cheriot_shared_object,SO,R-c-g" } diff --git a/clang/test/Misc/pragma-attribute-supported-attributes-list.test b/clang/test/Misc/pragma-attribute-supported-attributes-list.test index 6ec7bc0909bf2..e5ae19f51182d 100644 --- a/clang/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/clang/test/Misc/pragma-attribute-supported-attributes-list.test @@ -35,9 +35,9 @@ // CHECK-NEXT: CHERICCallee (SubjectMatchRule_function) // CHECK-NEXT: CHERICompartmentName (SubjectMatchRule_function) // CHECK-NEXT: CHERILibCall (SubjectMatchRule_function) -// CHECK-NEXT: CHERIOTMMIODevice (SubjectMatchRule_variable_is_global) -// CHECK-NEXT: CHERIOTSharedObject (SubjectMatchRule_variable_is_global) // CHECK-NEXT: CHERISubobjectBoundsUseRemainingSize (SubjectMatchRule_field, SubjectMatchRule_record) +// CHECK-NEXT: CHERIoTMMIODevice (SubjectMatchRule_variable_is_global) +// CHECK-NEXT: CHERIoTSharedObject (SubjectMatchRule_variable_is_global) // CHECK-NEXT: CPUDispatch (SubjectMatchRule_function) // CHECK-NEXT: CPUSpecific (SubjectMatchRule_function) // CHECK-NEXT: CUDAConstant (SubjectMatchRule_variable) diff --git a/clang/test/Sema/cheri/cheriot-cap-import-attr-ill-formed.c b/clang/test/Sema/cheri/cheriot-cap-import-attr-ill-formed.c index abb5ff69aeea5..a60de1e21c530 100644 --- a/clang/test/Sema/cheri/cheriot-cap-import-attr-ill-formed.c +++ b/clang/test/Sema/cheri/cheriot-cap-import-attr-ill-formed.c @@ -4,6 +4,8 @@ struct Uart {}; __attribute__((cheriot_mmio("uart", "xyz"))) extern struct Uart uart; // expected-error{{the permissions in 'cheriot_mmio' contain unknown permission symbols: 'xyz' (value: 'xyz')}} expected-warning{{global variable definition 'uart' has attribute 'cheriot_mmio' but is not qualified as `volatile`}} __attribute__((cheriot_mmio("uart", "RR"))) extern volatile struct Uart uart1; // expected-warning{{the permissions in 'cheriot_mmio' contain a duplicate permission symbol: 'R' (value: 'RR')}} __attribute__((cheriot_mmio("uart", "m"))) extern volatile struct Uart uart2; // expected-error{{the permissions in 'cheriot_mmio' contain ill-formed dependencies: does not contain either read (R) or write (W) (value: 'm')}} +__attribute__((cheriot_mmio("uart", "g"))) extern volatile struct Uart uart2; // expected-error{{the permissions in 'cheriot_mmio' contain ill-formed dependencies: does not contain either read (R) or write (W) (value: 'g')}} +__attribute__((cheriot_mmio("uart", "Wg"))) extern volatile struct Uart uart2; // expected-error{{the permissions in 'cheriot_mmio' contain ill-formed dependencies: contains load global (g) but does not have both read (R) and cap (c) (value: 'Wg')}} __attribute__((cheriot_mmio("uart", "R"))) volatile struct Uart uart3; // no warnings or errors, extern is implied __attribute__((cheriot_mmio("uart"))) volatile struct Uart uart4 = {}; // expected-error{{global variable definition 'uart4' with attribute 'cheriot_mmio' cannot have an initializer}} __attribute__((cheriot_mmio("uart"))) volatile struct {int k;} uart5 = {10}; // expected-error{{global variable definition 'uart5' with attribute 'cheriot_mmio' cannot have an initializer}} @@ -11,6 +13,8 @@ __attribute__((cheriot_mmio("uart", "R"))) extern volatile struct Uart *uart6; / __attribute__((cheriot_shared_object("exampleK", "RR"))) extern int exampleK; // expected-warning{{the permissions in 'cheriot_shared_object' contain a duplicate permission symbol: 'R' (value: 'RR')}} __attribute__((cheriot_shared_object("exampleK", "m"))) extern int exampleK; // expected-error{{the permissions in 'cheriot_shared_object' contain ill-formed dependencies: does not contain either read (R) or write (W) (value: 'm')}} __attribute__((cheriot_shared_object("exampleK", "Wm"))) extern int exampleK; // expected-error{{the permissions in 'cheriot_shared_object' contain ill-formed dependencies: contains mut (m) but does not have both read (R) and cap (c) (value: 'Wm')}} +__attribute__((cheriot_shared_object("exampleK", "g"))) extern int exampleK; // expected-error{{the permissions in 'cheriot_shared_object' contain ill-formed dependencies: does not contain either read (R) or write (W) (value: 'g')}} +__attribute__((cheriot_shared_object("exampleK", "Wg"))) extern int exampleK; // expected-error{{the permissions in 'cheriot_shared_object' contain ill-formed dependencies: contains load global (g) but does not have both read (R) and cap (c) (value: 'Wg')}} __attribute__((cheriot_shared_object("exampleK", "R"))) int exampleK; // no warnings or errors, extern is implied __attribute__((cheriot_shared_object("exampleK", "R"))) int exampleK2 = 10; // expected-error{{global variable definition 'exampleK2' with attribute 'cheriot_shared_object' cannot have an initializer}} __attribute__((cheriot_shared_object("exampleK", "R"))) int *exampleK3; /* no warnings or errors */ diff --git a/llvm/include/llvm/IR/Attributes.h b/llvm/include/llvm/IR/Attributes.h index dae6613391908..3431b77a409c4 100644 --- a/llvm/include/llvm/IR/Attributes.h +++ b/llvm/include/llvm/IR/Attributes.h @@ -1361,6 +1361,7 @@ class CHERIoTGlobalCapabilityImportAttr { SharedObject }; + // clang-format off /// Parses the string value previously constructed into an instance of the /// attribute object. The constructed string must have the following /// structure: `,,`. @@ -1375,16 +1376,19 @@ class CHERIoTGlobalCapabilityImportAttr { /// that it is assumed to be in this form: /// /// ``` - /// Permissions := ReadPermission WritePermissions CapPermission - /// MutPermission ReadPermission := `ReadPermissionSymbol` | "-" + /// Permissions := ReadPermission WritePermissions CapPermission LoadMutablePermission LoadGlobalPermission + /// ReadPermission := `ReadPermissionSymbol` | "-" /// WritePermission := `WritePermissionSymbol` | "-" /// CapPermission := `CapPermissionSymbol` | "-" /// WritePermission := `WritePermissionSymbol` | "-" + /// LoadMutablePermission := `LoadMutablePermissionSymbol` | "-" + /// LoadGlobalPermission := `LoadGlobalPermissionSymbol` | "-" /// ``` /// /// The resulting `GlobalCapabilityImportAttr` will have the `ImportKind` and /// `Domain` fields derived from ``, `ObjectName` equal to /// `` and `Permissions` equal to ``. + // clang-format on CHERIoTGlobalCapabilityImportAttr(StringRef ValueRef) { size_t NextSubstrStartsAt = 0; @@ -1463,7 +1467,8 @@ class CHERIoTGlobalCapabilityImportAttr { return (((Permissions[0] == *ReadPermissionSymbol) ? (1 << 31) : 0) + ((Permissions[1] == *WritePermissionSymbol) ? (1 << 30) : 0) + ((Permissions[2] == *CapPermissionSymbol) ? (1 << 29) : 0) + - ((Permissions[3] == *MutPermissionSymbol) ? (1 << 28) : 0)); + ((Permissions[3] == *LoadMutablePermissionSymbol) ? (1 << 28) : 0) + + ((Permissions[4] == *LoadGlobalPermissionSymbol) ? (1 << 27) : 0)); } /// Checks whether a permission encoding respects the semantic constraints. @@ -1480,8 +1485,9 @@ class CHERIoTGlobalCapabilityImportAttr { auto PermissionsRef = StringRef(Permissions); auto HasRead = PermissionsRef.contains(ReadPermissionSymbol); auto HasWrite = PermissionsRef.contains(WritePermissionSymbol); - auto HasMut = PermissionsRef.contains(MutPermissionSymbol); + auto HasMut = PermissionsRef.contains(LoadMutablePermissionSymbol); auto HasCap = PermissionsRef.contains(CapPermissionSymbol); + auto HasLoadGlobal = PermissionsRef.contains(LoadGlobalPermissionSymbol); if (!HasRead && !HasWrite) { FailedSemanticCheckCallback( @@ -1492,7 +1498,16 @@ class CHERIoTGlobalCapabilityImportAttr { if (HasMut && (!HasRead || !HasCap)) { FailedSemanticCheckCallback( - "contains mut (" + std::string(MutPermissionSymbol) + + "contains mut (" + std::string(LoadMutablePermissionSymbol) + + ") but does not have both read (" + + std::string(ReadPermissionSymbol) + ") and cap (" + + std::string(CapPermissionSymbol) + ")"); + return false; + } + + if (HasLoadGlobal && (!HasRead || !HasCap)) { + FailedSemanticCheckCallback( + "contains load global (" + std::string(LoadGlobalPermissionSymbol) + ") but does not have both read (" + std::string(ReadPermissionSymbol) + ") and cap (" + std::string(CapPermissionSymbol) + ")"); @@ -1502,7 +1517,8 @@ class CHERIoTGlobalCapabilityImportAttr { Permissions = ((HasRead ? Twine(ReadPermissionSymbol) : "-") + (HasWrite ? Twine(WritePermissionSymbol) : "-") + (HasCap ? Twine(CapPermissionSymbol) : "-") + - (HasMut ? Twine(MutPermissionSymbol) : "-")) + (HasMut ? Twine(LoadMutablePermissionSymbol) : "-") + + (HasLoadGlobal ? Twine(LoadGlobalPermissionSymbol) : "-")) .str(); return true; } @@ -1573,7 +1589,9 @@ class CHERIoTGlobalCapabilityImportAttr { static const std::string defaultPermissions() { return std::string(ReadPermissionSymbol) + std::string(WritePermissionSymbol) + - std::string(CapPermissionSymbol) + std::string(MutPermissionSymbol); + std::string(CapPermissionSymbol) + + std::string(LoadMutablePermissionSymbol) + + std::string(LoadGlobalPermissionSymbol); } ImportKind ImportKind; @@ -1596,11 +1614,14 @@ class CHERIoTGlobalCapabilityImportAttr { static constexpr const char *CapPermissionSymbol = "c"; /// The symbol for the mut permission. - static constexpr const char *MutPermissionSymbol = "m"; + static constexpr const char *LoadMutablePermissionSymbol = "m"; + + /// The symbol for the load global permission. + static constexpr const char *LoadGlobalPermissionSymbol = "g"; - static constexpr const std::array ValidSymbols = { + static constexpr const std::array ValidSymbols = { ReadPermissionSymbol[0], WritePermissionSymbol[0], CapPermissionSymbol[0], - MutPermissionSymbol[0]}; + LoadMutablePermissionSymbol[0], LoadGlobalPermissionSymbol[0]}; static constexpr const char *MmioImportKindStr = "mem"; static constexpr const char *SharedObjectImportKindStr = diff --git a/llvm/test/CodeGen/RISCV/cheri/global-cap-import-attributes.ll b/llvm/test/CodeGen/RISCV/cheri/global-cap-import-attributes.ll index 6fb95cd8bb084..3fbf5e2eef6fc 100644 --- a/llvm/test/CodeGen/RISCV/cheri/global-cap-import-attributes.ll +++ b/llvm/test/CodeGen/RISCV/cheri/global-cap-import-attributes.ll @@ -11,114 +11,121 @@ define dso_local void @_Z7examplev() addrspace(200) #0 { entry: ; CHECK: .LBB0_1: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_----") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-----") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_1)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_no_perm) ; CHECK: .LBB0_2: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_--c-") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_--c--") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_2)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_c) ; CHECK: .LBB0_3: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_---m") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_---m-") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_3)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_m) ; CHECK: .LBB0_4: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_--cm") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_----g") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_4)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_cm) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_g) ; CHECK: .LBB0_5: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-W--") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_--cm-") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_5)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_W) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_cm) ; CHECK: .LBB0_6: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-Wc-") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-W---") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_6)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Wc) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_W) ; CHECK: .LBB0_7: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-W-m") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-Wc--") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_7)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Wm) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Wc) ; CHECK: .LBB0_8: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-Wcm") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-W-m-") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_8)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Wcm) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Wm) ; CHECK: .LBB0_9: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R---") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_-Wcm-") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_9)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_R) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Wcm) -; CHECK: .LBB0_10: # %entry +; CHECK: .LBB0_10: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R-c-") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R----") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_10)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Rc) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_R) ; CHECK: .LBB0_11: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R--m") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R-c--") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_11)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Rm) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Rc) ; CHECK: .LBB0_12: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R-cm") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R--m-") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_12)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Rcm) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Rm) ; CHECK: .LBB0_13: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_RW--") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_R-cm-") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_13)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RW) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_Rcm) ; CHECK: .LBB0_14: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_RWc-") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_RW---") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_14)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart - call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWc) + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RW) ; CHECK: .LBB0_15: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_RW-m") +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_RWc--") ; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_15)(ca0) +; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWc) + +; CHECK: .LBB0_16: # %entry +; CHECK-NEXT: # Label of block must be emitted +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_mem_uart_RW-m-") +; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_16)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWm) ;; We will add more calls to this global, so it will be automatically spilled ;; to the stack to preserve it across calls. -; CHECK: .LBB0_16: # %entry +; CHECK: .LBB0_17: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc cs1, %cheriot_compartment_hi(__import_mem_uart_RWcm) -; CHECK-NEXT: clc cs1, %cheriot_compartment_lo_i(.LBB0_16)(cs1) +; CHECK-NEXT: auipcc cs1, %cheriot_compartment_hi("__import_mem_uart_RWcm-") +; CHECK-NEXT: clc cs1, %cheriot_compartment_lo_i(.LBB0_17)(cs1) ; CHECK-NEXT: cmove ca0, cs1 ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWcm) @@ -141,10 +148,10 @@ entry: ; Duplicate entry should refer to `__import_mem_uart_RWcm`, too. -; CHECK: .LBB0_17: # %entry +; CHECK: .LBB0_18: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc cs1, %cheriot_compartment_hi(__import_mem_uart_RWcm) -; CHECK-NEXT: clc cs1, %cheriot_compartment_lo_i(.LBB0_17)(cs1) +; CHECK-NEXT: auipcc cs1, %cheriot_compartment_hi("__import_mem_uart_RWcm-") +; CHECK-NEXT: clc cs1, %cheriot_compartment_lo_i(.LBB0_18)(cs1) ; CHECK-NEXT: cmove ca0, cs1 ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWcm2) @@ -153,193 +160,239 @@ entry: ; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWcm2) -; CHECK: .LBB0_18: # %entry +; CHECK: .LBB0_19: # %entry ; CHECK-NEXT: # Label of block must be emitted -; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi(__import_cheriot_shared_object_shared_obj_RWcm) -; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_18)(ca0) +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi("__import_cheriot_shared_object_shared_obj_RWcm-") +; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_19)(ca0) ; CHECK-NEXT: ccall _Z19doSomethingWithSharedObjectP4SharedObject call void @_Z19doSomethingWithSharedObjectP4SharedObject(ptr addrspace(200) noundef @shared_obj_RWcm) +; CHECK: .LBB0_20: # %entry +; CHECK-NEXT: # Label of block must be emitted +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi(__import_mem_uart_RWcmg) +; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_20)(ca0) +; CHECK-NEXT: ccall _Z19doSomethingWithUartP4Uart + call void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef @uart_RWcmg) + +; CHECK: .LBB0_21: # %entry +; CHECK-NEXT: # Label of block must be emitted +; CHECK-NEXT: auipcc ca0, %cheriot_compartment_hi(__import_cheriot_shared_object_shared_obj_RWcmg) +; CHECK-NEXT: clc ca0, %cheriot_compartment_lo_i(.LBB0_21)(ca0) +; CHECK-NEXT: ccall _Z19doSomethingWithSharedObjectP4SharedObject + call void @_Z19doSomethingWithSharedObjectP4SharedObject(ptr addrspace(200) noundef @shared_obj_RWcmg) + + ret void } declare dso_local void @_Z19doSomethingWithUartP4Uart(ptr addrspace(200) noundef) addrspace(200) #1 declare dso_local void @_Z19doSomethingWithSharedObjectP4SharedObject(ptr addrspace(200) noundef) addrspace(200) #1 -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_----",comdat -; CHECK-NEXT: .type "__import_mem_uart_----",@object -; CHECK-NEXT: .globl "__import_mem_uart_----" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-----",comdat +; CHECK-NEXT: .type "__import_mem_uart_-----",@object +; CHECK-NEXT: .globl "__import_mem_uart_-----" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_----": +; CHECK-NEXT: "__import_mem_uart_-----": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+0 -; CHECK-NEXT: .size "__import_mem_uart_----", 8 -@uart_no_perm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,----" +; CHECK-NEXT: .size "__import_mem_uart_-----", 8 +@uart_no_perm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-----" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_--c-",comdat -; CHECK-NEXT: .type "__import_mem_uart_--c-",@object -; CHECK-NEXT: .globl "__import_mem_uart_--c-" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_--c--",comdat +; CHECK-NEXT: .type "__import_mem_uart_--c--",@object +; CHECK-NEXT: .globl "__import_mem_uart_--c--" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_--c-": +; CHECK-NEXT: "__import_mem_uart_--c--": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+536870912 -; CHECK-NEXT: .size "__import_mem_uart_--c-", 8 -@uart_c = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,--c-" +; CHECK-NEXT: .size "__import_mem_uart_--c--", 8 +@uart_c = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,--c--" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_---m",comdat -; CHECK-NEXT: .type "__import_mem_uart_---m",@object -; CHECK-NEXT: .globl "__import_mem_uart_---m" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_---m-",comdat +; CHECK-NEXT: .type "__import_mem_uart_---m-",@object +; CHECK-NEXT: .globl "__import_mem_uart_---m-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_---m": +; CHECK-NEXT: "__import_mem_uart_---m-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+268435456 -; CHECK-NEXT: .size "__import_mem_uart_---m", 8 -@uart_m = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,---m" +; CHECK-NEXT: .size "__import_mem_uart_---m-", 8 +@uart_m = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,---m-" + +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_----g",comdat +; CHECK-NEXT: .type "__import_mem_uart_----g",@object +; CHECK-NEXT: .globl "__import_mem_uart_----g" +; CHECK-NEXT: .p2align 3, 0x0 +; CHECK-NEXT: "__import_mem_uart_----g": +; CHECK-NEXT: .word __export_mem_uart +; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+134217728 +; CHECK-NEXT: .size "__import_mem_uart_----g", 8 +@uart_g = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,----g" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_--cm",comdat -; CHECK-NEXT: .type "__import_mem_uart_--cm",@object -; CHECK-NEXT: .globl "__import_mem_uart_--cm" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_--cm-",comdat +; CHECK-NEXT: .type "__import_mem_uart_--cm-",@object +; CHECK-NEXT: .globl "__import_mem_uart_--cm-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_--cm": +; CHECK-NEXT: "__import_mem_uart_--cm-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+805306368 -; CHECK-NEXT: .size "__import_mem_uart_--cm", 8 -@uart_cm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,--cm" +; CHECK-NEXT: .size "__import_mem_uart_--cm-", 8 +@uart_cm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,--cm-" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-W--",comdat -; CHECK-NEXT: .type "__import_mem_uart_-W--",@object -; CHECK-NEXT: .globl "__import_mem_uart_-W--" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-W---",comdat +; CHECK-NEXT: .type "__import_mem_uart_-W---",@object +; CHECK-NEXT: .globl "__import_mem_uart_-W---" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_-W--": +; CHECK-NEXT: "__import_mem_uart_-W---": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+1073741824 -; CHECK-NEXT: .size "__import_mem_uart_-W--", 8 -@uart_W = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-W--" +; CHECK-NEXT: .size "__import_mem_uart_-W---", 8 +@uart_W = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-W---" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-Wc-",comdat -; CHECK-NEXT: .type "__import_mem_uart_-Wc-",@object -; CHECK-NEXT: .globl "__import_mem_uart_-Wc-" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-Wc--",comdat +; CHECK-NEXT: .type "__import_mem_uart_-Wc--",@object +; CHECK-NEXT: .globl "__import_mem_uart_-Wc--" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_-Wc-": +; CHECK-NEXT: "__import_mem_uart_-Wc--": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+1610612736 -; CHECK-NEXT: .size "__import_mem_uart_-Wc-", 8 -@uart_Wc = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-Wc-" +; CHECK-NEXT: .size "__import_mem_uart_-Wc--", 8 +@uart_Wc = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-Wc--" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-W-m",comdat -; CHECK-NEXT: .type "__import_mem_uart_-W-m",@object -; CHECK-NEXT: .globl "__import_mem_uart_-W-m" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-W-m-",comdat +; CHECK-NEXT: .type "__import_mem_uart_-W-m-",@object +; CHECK-NEXT: .globl "__import_mem_uart_-W-m-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_-W-m": +; CHECK-NEXT: "__import_mem_uart_-W-m-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+1342177280 -; CHECK-NEXT: .size "__import_mem_uart_-W-m", 8 -@uart_Wm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-W-m" +; CHECK-NEXT: .size "__import_mem_uart_-W-m-", 8 +@uart_Wm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-W-m-" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-Wcm",comdat -; CHECK-NEXT: .type "__import_mem_uart_-Wcm",@object -; CHECK-NEXT: .globl "__import_mem_uart_-Wcm" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_-Wcm-",comdat +; CHECK-NEXT: .type "__import_mem_uart_-Wcm-",@object +; CHECK-NEXT: .globl "__import_mem_uart_-Wcm-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_-Wcm": +; CHECK-NEXT: "__import_mem_uart_-Wcm-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)+1879048192 -; CHECK-NEXT: .size "__import_mem_uart_-Wcm", 8 -@uart_Wcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-Wcm" +; CHECK-NEXT: .size "__import_mem_uart_-Wcm-", 8 +@uart_Wcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,-Wcm-" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R---",comdat -; CHECK-NEXT: .type "__import_mem_uart_R---",@object -; CHECK-NEXT: .globl "__import_mem_uart_R---" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R----",comdat +; CHECK-NEXT: .type "__import_mem_uart_R----",@object +; CHECK-NEXT: .globl "__import_mem_uart_R----" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_R---": +; CHECK-NEXT: "__import_mem_uart_R----": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-2147483648 -; CHECK-NEXT: .size "__import_mem_uart_R---", 8 -@uart_R = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R---" +; CHECK-NEXT: .size "__import_mem_uart_R----", 8 +@uart_R = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R----" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R-c-",comdat -; CHECK-NEXT: .type "__import_mem_uart_R-c-",@object -; CHECK-NEXT: .globl "__import_mem_uart_R-c-" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R-c--",comdat +; CHECK-NEXT: .type "__import_mem_uart_R-c--",@object +; CHECK-NEXT: .globl "__import_mem_uart_R-c--" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_R-c-": +; CHECK-NEXT: "__import_mem_uart_R-c--": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-1610612736 -; CHECK-NEXT: .size "__import_mem_uart_R-c-", 8 -@uart_Rc = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R-c-" +; CHECK-NEXT: .size "__import_mem_uart_R-c--", 8 +@uart_Rc = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R-c--" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R--m",comdat -; CHECK-NEXT: .type "__import_mem_uart_R--m",@object -; CHECK-NEXT: .globl "__import_mem_uart_R--m" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R--m-",comdat +; CHECK-NEXT: .type "__import_mem_uart_R--m-",@object +; CHECK-NEXT: .globl "__import_mem_uart_R--m-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_R--m": +; CHECK-NEXT: "__import_mem_uart_R--m-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-1879048192 -; CHECK-NEXT: .size "__import_mem_uart_R--m", 8 -@uart_Rm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R--m" +; CHECK-NEXT: .size "__import_mem_uart_R--m-", 8 +@uart_Rm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R--m-" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R-cm",comdat -; CHECK-NEXT: .type "__import_mem_uart_R-cm",@object -; CHECK-NEXT: .globl "__import_mem_uart_R-cm" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_R-cm-",comdat +; CHECK-NEXT: .type "__import_mem_uart_R-cm-",@object +; CHECK-NEXT: .globl "__import_mem_uart_R-cm-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_R-cm": +; CHECK-NEXT: "__import_mem_uart_R-cm-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-1342177280 -; CHECK-NEXT: .size "__import_mem_uart_R-cm", 8 -@uart_Rcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R-cm" +; CHECK-NEXT: .size "__import_mem_uart_R-cm-", 8 +@uart_Rcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,R-cm-" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RW--",comdat -; CHECK-NEXT: .type "__import_mem_uart_RW--",@object -; CHECK-NEXT: .globl "__import_mem_uart_RW--" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RW---",comdat +; CHECK-NEXT: .type "__import_mem_uart_RW---",@object +; CHECK-NEXT: .globl "__import_mem_uart_RW---" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_RW--": +; CHECK-NEXT: "__import_mem_uart_RW---": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-1073741824 -; CHECK-NEXT: .size "__import_mem_uart_RW--", 8 -@uart_RW = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RW--" +; CHECK-NEXT: .size "__import_mem_uart_RW---", 8 +@uart_RW = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RW---" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RWc-",comdat -; CHECK-NEXT: .type "__import_mem_uart_RWc-",@object -; CHECK-NEXT: .globl "__import_mem_uart_RWc-" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RWc--",comdat +; CHECK-NEXT: .type "__import_mem_uart_RWc--",@object +; CHECK-NEXT: .globl "__import_mem_uart_RWc--" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_RWc-": +; CHECK-NEXT: "__import_mem_uart_RWc--": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-536870912 -; CHECK-NEXT: .size "__import_mem_uart_RWc-", 8 -@uart_RWc = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWc-" +; CHECK-NEXT: .size "__import_mem_uart_RWc--", 8 +@uart_RWc = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWc--" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RW-m",comdat -; CHECK-NEXT: .type "__import_mem_uart_RW-m",@object -; CHECK-NEXT: .globl "__import_mem_uart_RW-m" +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RW-m-",comdat +; CHECK-NEXT: .type "__import_mem_uart_RW-m-",@object +; CHECK-NEXT: .globl "__import_mem_uart_RW-m-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: "__import_mem_uart_RW-m": +; CHECK-NEXT: "__import_mem_uart_RW-m-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-805306368 -; CHECK-NEXT: .size "__import_mem_uart_RW-m", 8 -@uart_RWm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RW-m" +; CHECK-NEXT: .size "__import_mem_uart_RW-m-", 8 +@uart_RWm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RW-m-" ; Arbitrarily duplicated entry, made to check that two different globals that ; refer to the same mmio device do not produce two duplicated entries in the ; imports table. -@uart_RWcm2 = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWcm" +@uart_RWcm2 = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWcm-" -; CHECK: .section .compartment_imports.uart,"awG",@progbits,__import_mem_uart_RWcm,comdat -; CHECK-NEXT: .type __import_mem_uart_RWcm,@object -; CHECK-NEXT: .globl __import_mem_uart_RWcm +; CHECK: .section .compartment_imports.uart,"awG",@progbits,"__import_mem_uart_RWcm-",comdat +; CHECK-NEXT: .type "__import_mem_uart_RWcm-",@object +; CHECK-NEXT: .globl "__import_mem_uart_RWcm-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: __import_mem_uart_RWcm: +; CHECK-NEXT: "__import_mem_uart_RWcm-": ; CHECK-NEXT: .word __export_mem_uart ; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-268435456 -; CHECK-NEXT: .size __import_mem_uart_RWcm, 8 -@uart_RWcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWcm" +; CHECK-NEXT: .size "__import_mem_uart_RWcm-", 8 +@uart_RWcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWcm-" -; CHECK: .section .compartment_imports.shared_obj,"awG",@progbits,__import_cheriot_shared_object_shared_obj_RWcm,comdat -; CHECK-NEXT: .type __import_cheriot_shared_object_shared_obj_RWcm,@object -; CHECK-NEXT: .globl __import_cheriot_shared_object_shared_obj_RWcm +; CHECK: .section .compartment_imports.shared_obj,"awG",@progbits,"__import_cheriot_shared_object_shared_obj_RWcm-",comdat +; CHECK-NEXT: .type "__import_cheriot_shared_object_shared_obj_RWcm-",@object +; CHECK-NEXT: .globl "__import_cheriot_shared_object_shared_obj_RWcm-" ; CHECK-NEXT: .p2align 3, 0x0 -; CHECK-NEXT: __import_cheriot_shared_object_shared_obj_RWcm: +; CHECK-NEXT: "__import_cheriot_shared_object_shared_obj_RWcm-": ; CHECK-NEXT: .word __cheriot_shared_object_shared_obj ; CHECK-NEXT: .word (__cheriot_shared_object_shared_obj_end-__cheriot_shared_object_shared_obj)-268435456 -; CHECK-NEXT: .size __import_cheriot_shared_object_shared_obj_RWcm, 8 -@shared_obj_RWcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "cheriot_shared_object,shared_obj,RWcm" +; CHECK-NEXT: .size "__import_cheriot_shared_object_shared_obj_RWcm-", 8 +@shared_obj_RWcm = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "cheriot_shared_object,shared_obj,RWcm-" + +; CHECK: .section .compartment_imports.uart,"awG",@progbits,__import_mem_uart_RWcmg,comdat +; CHECK-NEXT: .type __import_mem_uart_RWcmg,@object +; CHECK-NEXT: .globl __import_mem_uart_RWcmg +; CHECK-NEXT: .p2align 3, 0x0 +; CHECK-NEXT: __import_mem_uart_RWcmg: +; CHECK-NEXT: .word __export_mem_uart +; CHECK-NEXT: .word (__export_mem_uart_end-__export_mem_uart)-134217728 +; CHECK-NEXT: .size __import_mem_uart_RWcmg, 8 +@uart_RWcmg = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "mem,uart,RWcmg" + +; CHECK: .section .compartment_imports.shared_obj,"awG",@progbits,__import_cheriot_shared_object_shared_obj_RWcmg,comdat +; CHECK-NEXT: .type __import_cheriot_shared_object_shared_obj_RWcmg,@object +; CHECK-NEXT: .globl __import_cheriot_shared_object_shared_obj_RWcmg +; CHECK-NEXT: .p2align 3, 0x0 +; CHECK-NEXT: __import_cheriot_shared_object_shared_obj_RWcmg: +; CHECK-NEXT: .word __cheriot_shared_object_shared_obj +; CHECK-NEXT: .word (__cheriot_shared_object_shared_obj_end-__cheriot_shared_object_shared_obj)-134217728 +; CHECK-NEXT: .size __import_cheriot_shared_object_shared_obj_RWcmg, 8 +@shared_obj_RWcmg = external addrspace(200) global %struct.Uart, align 1 "cheriot_global_cap_import" = "cheriot_shared_object,shared_obj,RWcmg" + attributes #0 = { mustprogress noinline optnone "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cheriot" "target-features"="+32bit,+c,+xcheripurecap,+e,+m,+relax,+xcheri,+zmmul,-a,-b,-d,-experimental-sdext,-experimental-sdtrig,-experimental-smctr,-experimental-ssctr,-experimental-svukte,-experimental-xqcia,-experimental-xqciac,-experimental-xqcicli,-experimental-xqcicm,-experimental-xqcics,-experimental-xqcicsr,-experimental-xqciint,-experimental-xqcilo,-experimental-xqcilsm,-experimental-xqcisls,-experimental-zalasr,-experimental-zicfilp,-experimental-zicfiss,-experimental-zvbc32e,-experimental-zvkgs,-f,-h,-i,-sha,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smcdeleg,-smcsrind,-smdbltrp,-smepmp,-smmpm,-smnpm,-smrnmi,-smstateen,-ssaia,-ssccfg,-ssccptr,-sscofpmf,-sscounterenw,-sscsrind,-ssdbltrp,-ssnpm,-sspm,-ssqosid,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-supm,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-svvptc,-v,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xmipscmove,-xmipslsp,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-xwchc,-za128rs,-za64rs,-zaamo,-zabha,-zacas,-zalrsc,-zama16b,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmop,-zcmp,-zcmt,-zdinx,-zfa,-zfbfmin,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zicsr,-zifencei,-zihintntl,-zihintpause,-zihpm,-zimop,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-ztso,-zvbb,-zvbc,-zve32f,-zve32x,-zve64d,-zve64f,-zve64x,-zvfbfmin,-zvfbfwma,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl128b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl32b,-zvl4096b,-zvl512b,-zvl64b,-zvl65536b,-zvl8192b" } attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="cheriot" "target-features"="+32bit,+c,+xcheripurecap,+e,+m,+relax,+xcheri,+zmmul,-a,-b,-d,-experimental-sdext,-experimental-sdtrig,-experimental-smctr,-experimental-ssctr,-experimental-svukte,-experimental-xqcia,-experimental-xqciac,-experimental-xqcicli,-experimental-xqcicm,-experimental-xqcics,-experimental-xqcicsr,-experimental-xqciint,-experimental-xqcilo,-experimental-xqcilsm,-experimental-xqcisls,-experimental-zalasr,-experimental-zicfilp,-experimental-zicfiss,-experimental-zvbc32e,-experimental-zvkgs,-f,-h,-i,-sha,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smcdeleg,-smcsrind,-smdbltrp,-smepmp,-smmpm,-smnpm,-smrnmi,-smstateen,-ssaia,-ssccfg,-ssccptr,-sscofpmf,-sscounterenw,-sscsrind,-ssdbltrp,-ssnpm,-sspm,-ssqosid,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-supm,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-svvptc,-v,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xmipscmove,-xmipslsp,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-xwchc,-za128rs,-za64rs,-zaamo,-zabha,-zacas,-zalrsc,-zama16b,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmop,-zcmp,-zcmt,-zdinx,-zfa,-zfbfmin,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zicsr,-zifencei,-zihintntl,-zihintpause,-zihpm,-zimop,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-ztso,-zvbb,-zvbc,-zve32f,-zve32x,-zve64d,-zve64f,-zve64x,-zvfbfmin,-zvfbfwma,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl128b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl32b,-zvl4096b,-zvl512b,-zvl64b,-zvl65536b,-zvl8192b" }