Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
B BuildSys
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Labels
    • Labels
  • Merge requests 7
    • Merge requests 7
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Members
    • Members
  • Activity
  • Graph
  • Jobs
  • Commits
Collapse sidebar
  • RiscOS
  • BuildSys
  • Merge requests
  • !24

Merged
Created Jul 16, 2020 by Ben Avison@bavisonDeveloper

Lay groundwork for moving a few modules to use CModule makefile

  • Overview 1
  • Commits 2
  • Changes 3

The ModuleDB classifies modules as being of type either ASM or C. The primary consumer of this information is srcbuild. The difference between them, as far as srcbuild is concerned, is only that in the install_rom phase, it builds the rom_link phony target in C components' makefiles, instead of the install_rom phony target.

These phony targets differ slightly in requirements: install_rom uses INSTDIR where rom_link uses LINKDIR, but more significantly, rom_link is passed parameter ADDRESS to state where in the ROM the module resides. This addesss is not known at the time the rom phony target is made, so C components only produce a partially-linked binary at that stage, where ASM components have already produced a complete binary. (The reason for this difference is that while hand-written assembly modules use position- independent code, the output of the Norcroft compiler normally relies on run-time code modification to relocate absolute addresses - something that is not possible when running from ROM.)

There are implementations of the install_rom and rom_link rules in the AAsmModule and CModule shared makefiles respectively, so AAsmModule is currently only used for ASM components and CModule is only used for C components. However, occasionally we have reason to change a component from using AAsmModule to CModule, usually for reasons unrelated to the use of absolute address relocations, because CModule is more flexible than AAsmModule in various other ways.

This poses a problem for keeping BuildSys in step with the component in question, because whenever we change the shared makefile type in the component's makefile, we have to update the ModuleDB in lock step.

The solution presented here is to ensure that at least one shared makefile supports both phony targets, so any component using it no longer cares how it is recorded in the ModuleDB. Adding install_rom to CModule was rejected, on the grounds that it would be too easy to accidentally build a ROM using it where the necessary relocations had been skipped at ROM link time. However, there are no drawbacks to adding rom_link to AAsmModule, because linking an object that has no relocations at any base address will always result in an identical binary that is safe to execute.

Though the module itself requires no relocations, the symbols file traditionally output by CModule does contain absolute addresses which are useful for debugging, so a new link command is executed during AAsmModule's rom_link rule in order to ensure this is kept up-to-date, even though the binary could otherwise have been re-used from the one generated in the rom rule.

In addition to this, change a few modules to C type in ModuleDB.

These components have pending merge requests that mean they are likely to move to use the CModule shared makefile in the near future, which will require the use of their rom_link rule. However, due to the change to AAsmModule above, we can change their type now in anticipation.

I'm not going further and change all ASM components en masse, because not all of them will yet have been converted to use AAsmModule. This is also the reason for not making the change in srcbuild itself.

Assignee
Assign to
Reviewer
Request review from
None
Milestone
None
Assign milestone
Time tracking
Source branch: RomLinkAsm