Skip to content

Commit

Permalink
[CHERI][clang] Require the preserve tags argument
Browse files Browse the repository at this point in the history
This ensures that we don't accidentally regress code generation
when merging from upstream.
  • Loading branch information
arichardson committed Sep 2, 2022
1 parent 4e0591f commit d4dc697
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 19 deletions.
26 changes: 11 additions & 15 deletions clang/lib/CodeGen/CGBuilder.h
Expand Up @@ -283,37 +283,33 @@ class CGBuilderTy : public CGBuilderBaseTy {
}

using CGBuilderBaseTy::CreateMemCpy;
llvm::CallInst *CreateMemCpy(
Address Dest, Address Src, llvm::Value *Size,
llvm::PreserveCheriTags PreserveTags = llvm::PreserveCheriTags::TODO,
bool IsVolatile = false) {
llvm::CallInst *CreateMemCpy(Address Dest, Address Src, llvm::Value *Size,
llvm::PreserveCheriTags PreserveTags,
bool IsVolatile = false) {
return CreateMemCpy(Dest.getPointer(), Dest.getAlignment().getAsAlign(),
Src.getPointer(), Src.getAlignment().getAsAlign(), Size,
PreserveTags, IsVolatile);
}
llvm::CallInst *CreateMemCpy(
Address Dest, Address Src, uint64_t Size,
llvm::PreserveCheriTags PreserveTags = llvm::PreserveCheriTags::TODO,
bool IsVolatile = false) {
llvm::CallInst *CreateMemCpy(Address Dest, Address Src, uint64_t Size,
llvm::PreserveCheriTags PreserveTags,
bool IsVolatile = false) {
return CreateMemCpy(Dest.getPointer(), Dest.getAlignment().getAsAlign(),
Src.getPointer(), Src.getAlignment().getAsAlign(), Size,
PreserveTags, IsVolatile);
}

using CGBuilderBaseTy::CreateMemCpyInline;
llvm::CallInst *CreateMemCpyInline(
Address Dest, Address Src, uint64_t Size,
llvm::PreserveCheriTags PreserveTags = llvm::PreserveCheriTags::TODO) {
llvm::CallInst *CreateMemCpyInline(Address Dest, Address Src, uint64_t Size,
llvm::PreserveCheriTags PreserveTags) {
return CreateMemCpyInline(
Dest.getPointer(), Dest.getAlignment().getAsAlign(), Src.getPointer(),
Src.getAlignment().getAsAlign(), getInt64(Size), PreserveTags);
}

using CGBuilderBaseTy::CreateMemMove;
llvm::CallInst *CreateMemMove(
Address Dest, Address Src, llvm::Value *Size,
llvm::PreserveCheriTags PreserveTags = llvm::PreserveCheriTags::TODO,
bool IsVolatile = false) {
llvm::CallInst *CreateMemMove(Address Dest, Address Src, llvm::Value *Size,
llvm::PreserveCheriTags PreserveTags,
bool IsVolatile = false) {
return CreateMemMove(Dest.getPointer(), Dest.getAlignment().getAsAlign(),
Src.getPointer(), Src.getAlignment().getAsAlign(),
Size, PreserveTags, IsVolatile);
Expand Down
15 changes: 12 additions & 3 deletions clang/lib/CodeGen/CGCall.cpp
Expand Up @@ -2763,10 +2763,13 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
// FIXME: We should have a common utility for generating an aggregate
// copy.
CharUnits Size = getContext().getTypeSizeInChars(Ty);
assert(!CGM.getTarget().areAllPointersCapabilities() &&
"Missing test case for llvm::PreserveCheriTags");
Builder.CreateMemCpy(
AlignedTemp.getPointer(), AlignedTemp.getAlignment().getAsAlign(),
ParamAddr.getPointer(), ParamAddr.getAlignment().getAsAlign(),
llvm::ConstantInt::get(IntPtrTy, Size.getQuantity()));
llvm::ConstantInt::get(IntPtrTy, Size.getQuantity()),
llvm::PreserveCheriTags::TODO);
V = AlignedTemp;
}
ArgVals.push_back(ParamValue::forIndirect(V));
Expand Down Expand Up @@ -2969,7 +2972,10 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
}

if (SrcSize > DstSize) {
Builder.CreateMemCpy(Ptr, AddrToStoreInto, DstSize);
assert(!CGM.getTarget().areAllPointersCapabilities() &&
"Missing test case for llvm::PreserveCheriTags");
Builder.CreateMemCpy(Ptr, AddrToStoreInto, DstSize,
llvm::PreserveCheriTags::TODO);
}

} else {
Expand Down Expand Up @@ -5018,10 +5024,13 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
// of the destination type to allow loading all of it. The bits past
// the source value are left undef.
if (SrcSize < DstSize) {
assert(!CGM.getTarget().areAllPointersCapabilities() &&
"Missing test case for llvm::PreserveCheriTags");
Address TempAlloca
= CreateTempAlloca(STy, Src.getAlignment(),
Src.getName() + ".coerce");
Builder.CreateMemCpy(TempAlloca, Src, SrcSize);
Builder.CreateMemCpy(TempAlloca, Src, SrcSize,
llvm::PreserveCheriTags::TODO);
Src = TempAlloca;
} else {
Src = Builder.CreateBitCast(Src,
Expand Down
2 changes: 2 additions & 0 deletions clang/lib/CodeGen/CGExprCXX.cpp
Expand Up @@ -561,6 +561,8 @@ static void EmitNullBaseClassInitialization(CodeGenFunction &CGF,
CharUnits StoreOffset = Store.first;
CharUnits StoreSize = Store.second;
llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
assert(!CGF.getTarget().areAllPointersCapabilities() &&
"Missing test case for llvm::PreserveCheriTags");
CGF.Builder.CreateMemCpy(
CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
CGF.Builder.CreateConstInBoundsByteGEP(SrcPtr, StoreOffset),
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/CodeGen/CGOpenMPRuntime.cpp
Expand Up @@ -4832,7 +4832,8 @@ static void emitDepobjElements(CodeGenFunction &CGF, QualType &KmpDependInfoTy,
Address(CGF.Builder.CreateGEP(DependenciesArray.getElementType(),
DependenciesArray.getPointer(), Pos),
DependenciesArray.getAlignment());
CGF.Builder.CreateMemCpy(DepAddr, Base.getAddress(CGF), Size);
CGF.Builder.CreateMemCpy(DepAddr, Base.getAddress(CGF), Size,
llvm::PreserveCheriTags::TODO);

// Increase pos.
// pos += size;
Expand Down

0 comments on commit d4dc697

Please sign in to comment.