Connecting LLVM with a WCET tool
Oké, ik denk dat ik nu kunnen beginnen. Waarom ben ik hier vandaag? Ik heb een masterproject gedaan, een graderatieproject op de relatieve LVM. En de hele idee is dat, als iemand met een kans gaat doen dezelfde ding, dan heb je al een start gehad. En dan heb je mijn missies en mijn werk. Dus het topic van mijn graderatie, het is om met LVM te connecten met een worst-case-accusentime tool. En ik zal wat dit in een minuut betekenen. Dus de talk zal volgen. Dus de eerste is, wat is dit worst-case-accusentime en het worst-case-accusentime-analysis? Want het is niet echt related met LVM, maar het is related met mijn project. Ja, en waarom zou je LVM te connecten met een worst-case-accusentime tool zonder het in het LVM zelf te proberen? En wat moet je picken? Dat heb ik al al gedaan. Het is een sweet tool. En ik heb mijn redenen voor het. En de manier van wat data te gebruiken van LVM en de datastructures. En ik zal het praten. En ik heb wat dingen gedaan met een specifieke architectuur, de armcortex, die ik zal shareen. En mijn ervaring met deze appartement. Dit vol concept in general. Wat ik doe. En ik zal het dan concluderen. Dus, eerst van het worst-case-accusentime. Het is een beetje een fysiologische concept. Maar imagine dat. Ik vraag je te ontdekken. Een software-routine voor het brengen op de auto. Ik denk dat je moet, door het design, hebben er wel een garantie van dat het afgaat. Want wanneer je brengt, wordt het niet geïnactiviteerd. En je auto moet op 3e of iets crashen. Dus het worst-case-accusentime is de heel langste tijd dat een p-code kan nemen. En je moet, door het design, een appartement hebben op dit. Dus hoe zou je dit worst-case-accusentime determineren? Of je moet zeggen, dat je je programma met alpossible ingebouwen hebt. Nou, dat begint niet te zijn, of niet makkelijk. Want in een non-trivial code zijn er veel teveel paarden om te kofferen. Dus, bijvoorbeeld, als je een functie met 2, 32-bit integers hebt. En je moet de programma veel en veel tijd hebben, om alpossible waarschijnlijk te zijn. Dus je moet zeggen, in praktijk moet je minder doen, maar je bent nooit echt zeker of je programma is arbitrarisch complex.  Dus, er is een ding called Static Analysis, waarin je een soort van rommende code gaat. Het gaat om de semantieken van de code en dan proberen we een soort mathematical derivation om een worst-case-accusentime te worden gebouwd. En de theorie van dit is called abstract interpretation. Dus ik wil dit opnieuw discussie met een vorm van een graf. Dus zeg je, op de y-acces hier, de probabiliteit van een deel gebeurt met een paar ingebouwen. Dus dat betekent en op de x-accusentime. Dus het zou zijn, dat op de deel hier, de red arrows, dat je er veel maatregelen en maatregelen, maar je bent niet zeker, je kan niet testen alle parten, alle mogelijkste ingebouwen. Dus je moet missen, het kan langer zijn, dus je moet een grote probleem hebben, als dat gebeurt. Dus de theorie kan dan een gebouw doen, een worst-case-accusentime gebouw. Het is Static Analysis om een gebouw te vinden dat is een beetje hoger dan de reale, die je niet kunt vinden, maar uiteindelijk is het veilig dat dat is wat de theorie doet. Dus, waarom verbindt het LVM met een tool die een worst-case-accusentime gebouw kan doen en waarom niet, gewoon neemt het in de LVM. Ja, eerst van alles, dat is echt hard, want de theorie is niet echt makkelijk. Je moet eigenlijk een PhD in Computer Science of een echt specifiek en een mathematical field om dit te kunnen verstaan. De tweede, er zijn de deel van het idee dat je de worst-case-accusentime gebouw kan doen langs de gebouw dat je compijlt, want je hebt de gebouw in datastructures in LVM. Dus je kunt en je kunt gebruiken informatie over de architectuur die in LVM geplaatst is door de bedrijven van scheduling en andere dingen. Dus dat is eigenlijk een tablegen. Dus, ja, er existen open source tools die de worst-case-accusentime gebouw kunnen doen. Dus waarom niet neemt het in de LVM? Dat was de hele idee. Dus de tweede suite was mijn beslissing voor mijn project. Het is een tool dat staat voor een 3D-accusentime tool. Dus, ja, het is een open source maar een beetje slecht open source dat betekent dat je ze moet e-mailen om de code te krijgen. Dus dat is weer. Het heeft een interface langs af voordat je een binary hebt.  Dus de tools reinterpreten de binary en dan doen control-flow-graphic constructions dus we hebben afwisselen enzovoorts. En dan dragen ze de semantie van de binary en doen static analysis. Maar dit tool is een beetje anders omdat je deze afwisseling hebt. Dus je kunt eigenlijk niet om ze alleen de verschillende binary-formaten te supporten. Er zijn verschillende tools terwijl ze voor de tweede suite zijn. Meestal zijn er ook een research tool. Meestal zijn er een bandomer of research tools. En er is één proprietary tool de AIT by the Absence company. Dat is een afwisseling die de markt helemaal domineren. Dus ja, er is geen open-source alternatief dat is weinig gebruikt in deze stuffen. No, the sweet tool is a bit of a specific way to use it. Basically, they ask you to change your code semantically to this alf language. And it does analysis on this alf language. So it can then find out which base blocks will be executed or not before you run the code, which I find to be really interesting. So it is the sweet tool. It needs two inputs. It needs alf code of your code, which is semantically the same, so the same calculations and so on. And you can also model your registers for memory in this alf code. Next to that, it needs for each basic block, it needs amount of instructions that it will take on your machine. Because sweet doesn't know it, it does analysis on alf. So you're expected to do like take an account caching and pipelining and two other things. And just provide them a list of basic block names with cycle counts. But all of this stems from the control photograph, is it necessary to have. We have this in LVM, because it's in a data structure. A small example of alf code which you probably cannot read, but I suppose you can look up these slides later. This would be an addition of two registers. The first thing you notice is that it's really verbose and annoying to read. And there are lots of 32-year, meaning that's the bed size. So they are really specific from the bed sizes that you use. Because that's where you get the possible ranges of values from your calculation.  The other thing you probably cannot see is that they add those two loads from frames called r0 and r1, which is these frames you can design yourself. It's basically a name with bed size. And sweet has an arbitrary amount of operators from which they claim you can model your instructions of your instruction set. Or add and so on. So next month my approach in the project to connect the sweet tool with LVM. So the whole thing is the output alf from LVM, because sweet uses alf. That might say it's easy. The thing is that this alfcode needs to be exactly semantically the same as the instructions on your processor. So if you make a mistake then your analysis is wrong and the worst case execution time is wrong and that's a really big problem. So the alfcode can be obtained from tablegen. From tablegen they use in the deck so the instruction selection when you go from IR code to the backhand you have they use the deck patterns and this is essentially semantically the meaning of what the instruction does. So this is what I use to output alfcode from the instructions from LVM. Now we should probably discuss this picture below. So this will be an easy overview of a simplified overview of LVM. So to the left you would have Klang or the frontend and it will go to the intermediate presentation and there are done architecture independent optimizations and then you would go to the backhand or A backhand or C2 and there you have two key data structures the machine instructions and the machine code and the difference here is that when you decompile assembly code or binary you go to machine code and then you do not have the control flow graph so the decisions in the code because that's really difficult to retrace when you have decisions made on values on registers that you do not know out of time. 