Skip to content

Commit a454551

Browse files
author
dsalinas_amdeng
committed
Resolve PR comments, add new Error tests.
1 parent 1447801 commit a454551

File tree

5 files changed

+35
-34
lines changed

5 files changed

+35
-34
lines changed

llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -210,27 +210,6 @@ static Error dumpSectionToFile(StringRef SecName, StringRef Filename,
210210
"section '%s' not found", SecName.str().c_str());
211211
}
212212

213-
static Error dumpRawDataURIToFile(StringRef Filename, int64_t Offset,
214-
int64_t Size, ObjectFile &Obj) {
215-
SmallString<2048> NameBuf;
216-
raw_svector_ostream OutputFileName(NameBuf);
217-
OutputFileName << Obj.getFileName().str() << "-offset" << Offset << "-size"
218-
<< Size << ".co";
219-
220-
Expected<std::unique_ptr<FileOutputBuffer>> BufferOrErr =
221-
FileOutputBuffer::create(OutputFileName.str(), Size);
222-
223-
if (!BufferOrErr)
224-
return BufferOrErr.takeError();
225-
226-
MemoryBufferRef Input = Obj.getMemoryBufferRef();
227-
std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr);
228-
std::copy(Input.getBufferStart(), Input.getBufferStart() + Size,
229-
Buf->getBufferStart());
230-
231-
return Buf->commit();
232-
}
233-
234213
Error Object::compressOrDecompressSections(const CommonConfig &Config) {
235214
// Build a list of sections we are going to replace.
236215
// We can't call `addSection` while iterating over sections,

llvm/lib/Object/OffloadBundle.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,23 @@ Error object::extractCodeObject(const ObjectFile &Source, int64_t Offset,
211211
if (Error Err = InputBuffOrErr.takeError())
212212
return Err;
213213

214+
if (Size > InputBuffOrErr->getBufferSize())
215+
return createStringError(inconvertibleErrorCode(),
216+
"size in URI is larger than source");
217+
if (Offset > InputBuffOrErr->getBufferSize())
218+
return createStringError(inconvertibleErrorCode(),
219+
"offset in URI is beyond the size of the source");
220+
if (Offset + Size > InputBuffOrErr->getBufferSize())
221+
return createStringError(
222+
inconvertibleErrorCode(),
223+
"offset + size in URI is beyond the size of the source");
224+
214225
std::unique_ptr<FileOutputBuffer> Buf = std::move(*BufferOrErr);
215226
std::copy(InputBuffOrErr->getBufferStart() + Offset,
216227
InputBuffOrErr->getBufferStart() + Offset + Size,
217228
Buf->getBufferStart());
218229
if (Error E = Buf->commit())
219-
return E;
230+
return createFileError(OutputFileName, std::move(E));
220231

221232
return Error::success();
222233
}
@@ -229,6 +240,7 @@ Error object::extractOffloadBundleByURI(StringRef URIstr) {
229240
OffloadBundleURI::createOffloadBundleURI(URIstr, FILE_URI));
230241
if (!UriOrErr)
231242
return UriOrErr.takeError();
243+
232244
OffloadBundleURI &Uri = **UriOrErr;
233245
std::string OutputFile = Uri.FileName.str();
234246
OutputFile +=
@@ -237,12 +249,12 @@ Error object::extractOffloadBundleByURI(StringRef URIstr) {
237249
// Create an ObjectFile object from uri.file_uri
238250
auto ObjOrErr = ObjectFile::createObjectFile(Uri.FileName);
239251
if (!ObjOrErr)
240-
return ObjOrErr.takeError();
252+
return createFileError(Uri.FileName, ObjOrErr.takeError());
241253

242254
auto Obj = ObjOrErr->getBinary();
243255
if (Error Err =
244256
object::extractCodeObject(*Obj, Uri.Offset, Uri.Size, OutputFile))
245-
return Err;
257+
return std::move(Err);
246258

247259
return Error::success();
248260
}

llvm/test/tools/llvm-objcopy/ELF/dump-offload-bundle.test

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@
66
# RUN: llvm-objcopy --dump-offload-bundle=file://%t.elf#offset=8192\&size=4048
77
# RUN: llvm-objdump -d %t.elf-offset8192-size4048.co | FileCheck %s
88

9+
# RUN: not llvm-objcopy --dump-offload-bundle=file://%t.elf#offset=8192\&size=4048000 2>&1 | \
10+
# RUN: FileCheck %s --check-prefix=ERR1
11+
12+
# RUN: not llvm-objcopy --dump-offload-bundle=file://%t.elf#offset=819200000\&size=4048 2>&1 | \
13+
# RUN: FileCheck %s --check-prefix=ERR2
14+
15+
# RUN: not llvm-objcopy --dump-offload-bundle=file://%t.elf#offset=8192\&size=8048 2>&1 | \
16+
# RUN: FileCheck %s --check-prefix=ERR3
17+
918
# CHECK: s_load_dword s7, s[4:5], 0x24 // 000000001900: C00201C2 00000024
1019
# CHECK-NEXT: s_load_dwordx4 s[0:3], s[4:5], 0x0 // 000000001908: C00A0002 00000000
1120
# CHECK-NEXT: v_mov_b32_e32 v1, 0 // 000000001910: 7E020280
@@ -27,6 +36,10 @@
2736
# CHECK-NEXT: global_store_dword v[0:1], v2, off // 000000001960: DC708000 007F0200
2837
# CHECK-NEXT: s_endpgm // 000000001968: BF810000
2938

39+
# ERR1: error: size in URI is larger than source
40+
# ERR2: error: offset in URI is beyond the size of the source
41+
# ERR3: error: offset + size in URI is beyond the size of the source
42+
3043
--- !ELF
3144
FileHeader:
3245
Class: ELFCLASS64

llvm/tools/llvm-objcopy/ObjcopyOptions.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,8 @@ static Expected<uint8_t> parseVisibilityType(StringRef VisType) {
288288

289289
Expected<StringRef> llvm::objcopy::parseDumpOffloadBundle(StringRef URI) {
290290
if (Error Err = object::extractOffloadBundleByURI(URI))
291-
return createStringError(errc::invalid_argument,
292-
"failed to extract from URI");
291+
return std::move(Err);
292+
293293
return URI;
294294
}
295295

@@ -1445,7 +1445,6 @@ objcopy::parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) {
14451445
return createStringError(
14461446
errc::invalid_argument,
14471447
"llvm-install-name-tool expects a single input file");
1448-
14491448
Config.InputFilename = Positional[0];
14501449
Config.OutputFilename = Positional[0];
14511450

@@ -1499,9 +1498,8 @@ objcopy::parseBitcodeStripOptions(ArrayRef<const char *> ArgsArr,
14991498
for (auto *Arg : InputArgs.filtered(BITCODE_STRIP_INPUT))
15001499
Positional.push_back(Arg->getValue());
15011500
if (Positional.size() > 1)
1502-
return createStringError(
1503-
errc::invalid_argument,
1504-
"llvm-bitcode-strip expects a single input file");
1501+
return createStringError(errc::invalid_argument,
1502+
"llvm-bitcode-strip expects a single input file");
15051503
assert(!Positional.empty());
15061504
Config.InputFilename = Positional[0];
15071505

@@ -1579,8 +1577,7 @@ objcopy::parseStripOptions(ArrayRef<const char *> RawArgsArr,
15791577
std::copy(DashDash, RawArgsArr.end(), std::back_inserter(Positional));
15801578

15811579
if (Positional.empty())
1582-
return createStringError(errc::invalid_argument,
1583-
"no input file specified");
1580+
return createStringError(errc::invalid_argument, "no input file specified");
15841581

15851582
if (Positional.size() > 1 && InputArgs.hasArg(STRIP_output))
15861583
return createStringError(

llvm/tools/llvm-objcopy/ObjcopyOptions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ Expected<DriverConfig>
5252
parseStripOptions(ArrayRef<const char *> ArgsArr,
5353
llvm::function_ref<Error(Error)> ErrorCallback);
5454

55-
// parseDumpOffloadBundle reads a URI as a string and extracts the raw memory into a
56-
// code object file named from the URI string given.
55+
// parseDumpOffloadBundle reads a URI as a string and extracts the raw memory
56+
// into a code object file named from the URI string given.
5757
Expected<StringRef> parseDumpOffloadBundle(StringRef URI);
5858

5959
} // namespace objcopy

0 commit comments

Comments
 (0)