@@ -935,8 +935,7 @@ CreateFileHandler(MemoryBuffer &FirstInput,
935
935
" '" + FilesType + " ': invalid file type specified" );
936
936
}
937
937
938
- OffloadBundlerConfig::OffloadBundlerConfig ()
939
- : CompressedBundleVersion(CompressedOffloadBundle::DefaultVersion) {
938
+ OffloadBundlerConfig::OffloadBundlerConfig () {
940
939
if (llvm::compression::zstd::isAvailable ()) {
941
940
CompressionFormat = llvm::compression::Format::Zstd;
942
941
// Compression level 3 is usually sufficient for zstd since long distance
@@ -952,13 +951,16 @@ OffloadBundlerConfig::OffloadBundlerConfig()
952
951
llvm::sys::Process::GetEnv (" OFFLOAD_BUNDLER_IGNORE_ENV_VAR" );
953
952
if (IgnoreEnvVarOpt.has_value () && IgnoreEnvVarOpt.value () == " 1" )
954
953
return ;
954
+
955
955
auto VerboseEnvVarOpt = llvm::sys::Process::GetEnv (" OFFLOAD_BUNDLER_VERBOSE" );
956
956
if (VerboseEnvVarOpt.has_value ())
957
957
Verbose = VerboseEnvVarOpt.value () == " 1" ;
958
+
958
959
auto CompressEnvVarOpt =
959
960
llvm::sys::Process::GetEnv (" OFFLOAD_BUNDLER_COMPRESS" );
960
961
if (CompressEnvVarOpt.has_value ())
961
962
Compress = CompressEnvVarOpt.value () == " 1" ;
963
+
962
964
auto CompressionLevelEnvVarOpt =
963
965
llvm::sys::Process::GetEnv (" OFFLOAD_BUNDLER_COMPRESSION_LEVEL" );
964
966
if (CompressionLevelEnvVarOpt.has_value ()) {
@@ -971,26 +973,6 @@ OffloadBundlerConfig::OffloadBundlerConfig()
971
973
<< " Warning: Invalid value for OFFLOAD_BUNDLER_COMPRESSION_LEVEL: "
972
974
<< CompressionLevelStr.str () << " . Ignoring it.\n " ;
973
975
}
974
- auto CompressedBundleFormatVersionOpt =
975
- llvm::sys::Process::GetEnv (" COMPRESSED_BUNDLE_FORMAT_VERSION" );
976
- if (CompressedBundleFormatVersionOpt.has_value ()) {
977
- llvm::StringRef VersionStr = CompressedBundleFormatVersionOpt.value ();
978
- uint16_t Version;
979
- if (!VersionStr.getAsInteger (10 , Version)) {
980
- if (Version >= 2 && Version <= 3 )
981
- CompressedBundleVersion = Version;
982
- else
983
- llvm::errs ()
984
- << " Warning: Invalid value for COMPRESSED_BUNDLE_FORMAT_VERSION: "
985
- << VersionStr.str ()
986
- << " . Valid values are 2 or 3. Using default version "
987
- << CompressedBundleVersion << " .\n " ;
988
- } else
989
- llvm::errs ()
990
- << " Warning: Invalid value for COMPRESSED_BUNDLE_FORMAT_VERSION: "
991
- << VersionStr.str () << " . Using default version "
992
- << CompressedBundleVersion << " .\n " ;
993
- }
994
976
}
995
977
996
978
// Utility function to format numbers with commas
@@ -1007,11 +989,12 @@ static std::string formatWithCommas(unsigned long long Value) {
1007
989
llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
1008
990
CompressedOffloadBundle::compress (llvm::compression::Params P,
1009
991
const llvm::MemoryBuffer &Input,
1010
- uint16_t Version, bool Verbose) {
992
+ bool Verbose) {
1011
993
if (!llvm::compression::zstd::isAvailable () &&
1012
994
!llvm::compression::zlib::isAvailable ())
1013
995
return createStringError (llvm::inconvertibleErrorCode (),
1014
996
" Compression not supported" );
997
+
1015
998
llvm::Timer HashTimer (" Hash Calculation Timer" , " Hash calculation time" ,
1016
999
*ClangOffloadBundlerTimerGroup);
1017
1000
if (Verbose)
@@ -1028,6 +1011,7 @@ CompressedOffloadBundle::compress(llvm::compression::Params P,
1028
1011
auto BufferUint8 = llvm::ArrayRef<uint8_t >(
1029
1012
reinterpret_cast <const uint8_t *>(Input.getBuffer ().data ()),
1030
1013
Input.getBuffer ().size ());
1014
+
1031
1015
llvm::Timer CompressTimer (" Compression Timer" , " Compression time" ,
1032
1016
*ClangOffloadBundlerTimerGroup);
1033
1017
if (Verbose)
@@ -1037,54 +1021,22 @@ CompressedOffloadBundle::compress(llvm::compression::Params P,
1037
1021
CompressTimer.stopTimer ();
1038
1022
1039
1023
uint16_t CompressionMethod = static_cast <uint16_t >(P.format );
1040
-
1041
- // Store sizes in 64-bit variables first
1042
- uint64_t UncompressedSize64 = Input.getBuffer ().size ();
1043
- uint64_t TotalFileSize64;
1044
-
1045
- // Calculate total file size based on version
1046
- if (Version == 2 ) {
1047
- // For V2, ensure the sizes don't exceed 32-bit limit
1048
- if (UncompressedSize64 > std::numeric_limits<uint32_t >::max ())
1049
- return createStringError (llvm::inconvertibleErrorCode (),
1050
- " Uncompressed size exceeds version 2 limit" );
1051
- if ((MagicNumber.size () + sizeof (uint32_t ) + sizeof (Version) +
1052
- sizeof (CompressionMethod) + sizeof (uint32_t ) + sizeof (TruncatedHash) +
1053
- CompressedBuffer.size ()) > std::numeric_limits<uint32_t >::max ())
1054
- return createStringError (llvm::inconvertibleErrorCode (),
1055
- " Total file size exceeds version 2 limit" );
1056
-
1057
- TotalFileSize64 = MagicNumber.size () + sizeof (uint32_t ) + sizeof (Version) +
1058
- sizeof (CompressionMethod) + sizeof (uint32_t ) +
1059
- sizeof (TruncatedHash) + CompressedBuffer.size ();
1060
- } else { // Version 3
1061
- TotalFileSize64 = MagicNumber.size () + sizeof (uint64_t ) + sizeof (Version) +
1062
- sizeof (CompressionMethod) + sizeof (uint64_t ) +
1063
- sizeof (TruncatedHash) + CompressedBuffer.size ();
1064
- }
1024
+ uint32_t UncompressedSize = Input.getBuffer ().size ();
1025
+ uint32_t TotalFileSize = MagicNumber.size () + sizeof (TotalFileSize) +
1026
+ sizeof (Version) + sizeof (CompressionMethod) +
1027
+ sizeof (UncompressedSize) + sizeof (TruncatedHash) +
1028
+ CompressedBuffer.size ();
1065
1029
1066
1030
SmallVector<char , 0 > FinalBuffer;
1067
1031
llvm::raw_svector_ostream OS (FinalBuffer);
1068
1032
OS << MagicNumber;
1069
1033
OS.write (reinterpret_cast <const char *>(&Version), sizeof (Version));
1070
1034
OS.write (reinterpret_cast <const char *>(&CompressionMethod),
1071
1035
sizeof (CompressionMethod));
1072
-
1073
- // Write size fields according to version
1074
- if (Version == 2 ) {
1075
- uint32_t TotalFileSize32 = static_cast <uint32_t >(TotalFileSize64);
1076
- uint32_t UncompressedSize32 = static_cast <uint32_t >(UncompressedSize64);
1077
- OS.write (reinterpret_cast <const char *>(&TotalFileSize32),
1078
- sizeof (TotalFileSize32));
1079
- OS.write (reinterpret_cast <const char *>(&UncompressedSize32),
1080
- sizeof (UncompressedSize32));
1081
- } else { // Version 3
1082
- OS.write (reinterpret_cast <const char *>(&TotalFileSize64),
1083
- sizeof (TotalFileSize64));
1084
- OS.write (reinterpret_cast <const char *>(&UncompressedSize64),
1085
- sizeof (UncompressedSize64));
1086
- }
1087
-
1036
+ OS.write (reinterpret_cast <const char *>(&TotalFileSize),
1037
+ sizeof (TotalFileSize));
1038
+ OS.write (reinterpret_cast <const char *>(&UncompressedSize),
1039
+ sizeof (UncompressedSize));
1088
1040
OS.write (reinterpret_cast <const char *>(&TruncatedHash),
1089
1041
sizeof (TruncatedHash));
1090
1042
OS.write (reinterpret_cast <const char *>(CompressedBuffer.data ()),
@@ -1094,17 +1046,18 @@ CompressedOffloadBundle::compress(llvm::compression::Params P,
1094
1046
auto MethodUsed =
1095
1047
P.format == llvm::compression::Format::Zstd ? " zstd" : " zlib" ;
1096
1048
double CompressionRate =
1097
- static_cast <double >(UncompressedSize64 ) / CompressedBuffer.size ();
1049
+ static_cast <double >(UncompressedSize ) / CompressedBuffer.size ();
1098
1050
double CompressionTimeSeconds = CompressTimer.getTotalTime ().getWallTime ();
1099
1051
double CompressionSpeedMBs =
1100
- (UncompressedSize64 / (1024.0 * 1024.0 )) / CompressionTimeSeconds;
1052
+ (UncompressedSize / (1024.0 * 1024.0 )) / CompressionTimeSeconds;
1053
+
1101
1054
llvm::errs () << " Compressed bundle format version: " << Version << " \n "
1102
1055
<< " Total file size (including headers): "
1103
- << formatWithCommas (TotalFileSize64 ) << " bytes\n "
1056
+ << formatWithCommas (TotalFileSize ) << " bytes\n "
1104
1057
<< " Compression method used: " << MethodUsed << " \n "
1105
1058
<< " Compression level: " << P.level << " \n "
1106
1059
<< " Binary size before compression: "
1107
- << formatWithCommas (UncompressedSize64 ) << " bytes\n "
1060
+ << formatWithCommas (UncompressedSize ) << " bytes\n "
1108
1061
<< " Binary size after compression: "
1109
1062
<< formatWithCommas (CompressedBuffer.size ()) << " bytes\n "
1110
1063
<< " Compression rate: "
@@ -1116,17 +1069,16 @@ CompressedOffloadBundle::compress(llvm::compression::Params P,
1116
1069
<< " Truncated MD5 hash: "
1117
1070
<< llvm::format_hex (TruncatedHash, 16 ) << " \n " ;
1118
1071
}
1119
-
1120
1072
return llvm::MemoryBuffer::getMemBufferCopy (
1121
1073
llvm::StringRef (FinalBuffer.data (), FinalBuffer.size ()));
1122
1074
}
1123
1075
1124
1076
llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
1125
1077
CompressedOffloadBundle::decompress (const llvm::MemoryBuffer &Input,
1126
1078
bool Verbose) {
1079
+
1127
1080
StringRef Blob = Input.getBuffer ();
1128
1081
1129
- // Check minimum header size (using V1 as it's the smallest)
1130
1082
if (Blob.size () < V1HeaderSize)
1131
1083
return llvm::MemoryBuffer::getMemBufferCopy (Blob);
1132
1084
@@ -1139,56 +1091,31 @@ CompressedOffloadBundle::decompress(const llvm::MemoryBuffer &Input,
1139
1091
1140
1092
size_t CurrentOffset = MagicSize;
1141
1093
1142
- // Read version
1143
1094
uint16_t ThisVersion;
1144
1095
memcpy (&ThisVersion, Blob.data () + CurrentOffset, sizeof (uint16_t ));
1145
1096
CurrentOffset += VersionFieldSize;
1146
1097
1147
- // Verify header size based on version
1148
- if (ThisVersion >= 2 && ThisVersion <= 3 ) {
1149
- size_t RequiredSize = (ThisVersion == 2 ) ? V2HeaderSize : V3HeaderSize;
1150
- if (Blob.size () < RequiredSize)
1151
- return createStringError (inconvertibleErrorCode (),
1152
- " Compressed bundle header size too small" );
1153
- }
1154
-
1155
- // Read compression method
1156
1098
uint16_t CompressionMethod;
1157
1099
memcpy (&CompressionMethod, Blob.data () + CurrentOffset, sizeof (uint16_t ));
1158
1100
CurrentOffset += MethodFieldSize;
1159
1101
1160
- // Read total file size (version 2+)
1161
- uint64_t TotalFileSize = 0 ;
1102
+ uint32_t TotalFileSize;
1162
1103
if (ThisVersion >= 2 ) {
1163
- if (ThisVersion == 2 ) {
1164
- uint32_t TotalFileSize32;
1165
- memcpy (&TotalFileSize32, Blob.data () + CurrentOffset, sizeof (uint32_t ));
1166
- TotalFileSize = TotalFileSize32;
1167
- CurrentOffset += FileSizeFieldSizeV2;
1168
- } else { // Version 3
1169
- memcpy (&TotalFileSize, Blob.data () + CurrentOffset, sizeof (uint64_t ));
1170
- CurrentOffset += FileSizeFieldSizeV3;
1171
- }
1104
+ if (Blob.size () < V2HeaderSize)
1105
+ return createStringError (inconvertibleErrorCode (),
1106
+ " Compressed bundle header size too small" );
1107
+ memcpy (&TotalFileSize, Blob.data () + CurrentOffset, sizeof (uint32_t ));
1108
+ CurrentOffset += FileSizeFieldSize;
1172
1109
}
1173
1110
1174
- // Read uncompressed size
1175
- uint64_t UncompressedSize = 0 ;
1176
- if (ThisVersion <= 2 ) {
1177
- uint32_t UncompressedSize32;
1178
- memcpy (&UncompressedSize32, Blob.data () + CurrentOffset, sizeof (uint32_t ));
1179
- UncompressedSize = UncompressedSize32;
1180
- CurrentOffset += UncompressedSizeFieldSizeV2;
1181
- } else { // Version 3
1182
- memcpy (&UncompressedSize, Blob.data () + CurrentOffset, sizeof (uint64_t ));
1183
- CurrentOffset += UncompressedSizeFieldSizeV3;
1184
- }
1111
+ uint32_t UncompressedSize;
1112
+ memcpy (&UncompressedSize, Blob.data () + CurrentOffset, sizeof (uint32_t ));
1113
+ CurrentOffset += UncompressedSizeFieldSize;
1185
1114
1186
- // Read hash
1187
1115
uint64_t StoredHash;
1188
1116
memcpy (&StoredHash, Blob.data () + CurrentOffset, sizeof (uint64_t ));
1189
1117
CurrentOffset += HashFieldSize;
1190
1118
1191
- // Determine compression format
1192
1119
llvm::compression::Format CompressionFormat;
1193
1120
if (CompressionMethod ==
1194
1121
static_cast <uint16_t >(llvm::compression::Format::Zlib))
@@ -1454,8 +1381,7 @@ Error OffloadBundler::BundleFiles() {
1454
1381
auto CompressionResult = CompressedOffloadBundle::compress (
1455
1382
{BundlerConfig.CompressionFormat , BundlerConfig.CompressionLevel ,
1456
1383
/* zstdEnableLdm=*/ true },
1457
- *BufferMemory, BundlerConfig.CompressedBundleVersion ,
1458
- BundlerConfig.Verbose );
1384
+ *BufferMemory, BundlerConfig.Verbose );
1459
1385
if (auto Error = CompressionResult.takeError ())
1460
1386
return Error;
1461
1387
0 commit comments