[llvm] [yaml2obj][XOFF] Update yaml2obj for XCOFF to create valid XCOFF files in more cases. (PR #77620)
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 25 00:47:47 PST 2024
================
@@ -98,30 +107,42 @@ bool XCOFFWriter::nameShouldBeInStringTable(StringRef SymbolName) {
bool XCOFFWriter::initRelocations(uint64_t &CurrentOffset) {
for (XCOFFYAML::Section &InitSection : InitSections) {
if (!InitSection.Relocations.empty()) {
- InitSection.NumberOfRelocations = InitSection.Relocations.size();
- InitSection.FileOffsetToRelocations = CurrentOffset;
uint64_t RelSize = Is64Bit ? XCOFF::RelocationSerializationSize64
: XCOFF::RelocationSerializationSize32;
- CurrentOffset += InitSection.NumberOfRelocations * RelSize;
+ uint64_t UsedSize = RelSize * InitSection.Relocations.size();
+
+ // If NumberOfRelocations was specified, we use it, even if it's
+ // not consistent with the number of provided relocations.
+ if (!InitSection.NumberOfRelocations)
+ InitSection.NumberOfRelocations = InitSection.Relocations.size();
+
+ // If the YAML file specified an offset to relocations, we use it.
+ if (InitSection.FileOffsetToRelocations) {
+ if (CurrentOffset > InitSection.FileOffsetToRelocations) {
+ ErrOverwrite(CurrentOffset, InitSection.FileOffsetToRelocations,
+ "FileOffsetToRelocations for the " +
+ InitSection.SectionName + " section");
+ return false;
+ }
+ CurrentOffset = InitSection.FileOffsetToRelocations;
+ } else
+ InitSection.FileOffsetToRelocations = CurrentOffset;
+ CurrentOffset += UsedSize;
if (CurrentOffset > MaxRawDataSize) {
- ErrHandler("maximum object size of" + Twine(MaxRawDataSize) +
- "exceeded when writing relocation data");
+ ErrHandler("maximum object size (" + Twine(MaxRawDataSize) +
+ ") exceeded when writing relocation data for section " +
+ Twine(InitSection.SectionName));
----------------
jh7370 wrote:
Is this tested somewhere? If so, could that test be expanded to check the section name that is now in the message? If not, it should be tested.
https://github.com/llvm/llvm-project/pull/77620
More information about the llvm-commits
mailing list