| OLD | NEW |
| 1 //===- SimplifyStructRegSignatures.cpp - struct regs to struct pointers----===// | 1 //===- SimplifyStructRegSignatures.cpp - struct regs to struct pointers----===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This pass replaces function signatures exposing struct registers | 10 // This pass replaces function signatures exposing struct registers |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "llvm/IR/Type.h" | 48 #include "llvm/IR/Type.h" |
| 49 #include "llvm/IR/Use.h" | 49 #include "llvm/IR/Use.h" |
| 50 #include "llvm/IR/User.h" | 50 #include "llvm/IR/User.h" |
| 51 #include "llvm/IR/Value.h" | 51 #include "llvm/IR/Value.h" |
| 52 #include "llvm/Pass.h" | 52 #include "llvm/Pass.h" |
| 53 #include "llvm/PassInfo.h" | 53 #include "llvm/PassInfo.h" |
| 54 #include "llvm/PassRegistry.h" | 54 #include "llvm/PassRegistry.h" |
| 55 #include "llvm/PassSupport.h" | 55 #include "llvm/PassSupport.h" |
| 56 #include "llvm/Transforms/NaCl.h" | 56 #include "llvm/Transforms/NaCl.h" |
| 57 #include "llvm/Support/Debug.h" | 57 #include "llvm/Support/Debug.h" |
| 58 #include "llvm/Support/raw_ostream.h" |
| 58 | 59 |
| 59 #include <cassert> | 60 #include <cassert> |
| 60 #include <cstddef> | 61 #include <cstddef> |
| 61 | 62 |
| 62 using namespace llvm; | 63 using namespace llvm; |
| 63 | 64 |
| 64 namespace { | 65 namespace { |
| 65 | 66 |
| 66 static const unsigned int TypicalFuncArity = 8; | 67 static const unsigned int TypicalFuncArity = 8; |
| 67 | 68 |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 UpdateArgNames(OldFunc, NewFunc); | 472 UpdateArgNames(OldFunc, NewFunc); |
| 472 ApplyByValAndSRet(OldFunc, NewFunc); | 473 ApplyByValAndSRet(OldFunc, NewFunc); |
| 473 | 474 |
| 474 NewFunc->getBasicBlockList().splice(NewFunc->begin(), | 475 NewFunc->getBasicBlockList().splice(NewFunc->begin(), |
| 475 OldFunc->getBasicBlockList()); | 476 OldFunc->getBasicBlockList()); |
| 476 | 477 |
| 477 fixFunctionBody(Ctx, OldFunc, NewFunc); | 478 fixFunctionBody(Ctx, OldFunc, NewFunc); |
| 478 FunctionsToDelete.insert(OldFunc); | 479 FunctionsToDelete.insert(OldFunc); |
| 479 auto Found = DISubprogramMap.find(OldFunc); | 480 auto Found = DISubprogramMap.find(OldFunc); |
| 480 if (Found != DISubprogramMap.end()) | 481 if (Found != DISubprogramMap.end()) |
| 481 Found->second.replaceFunction(NewFunc); | 482 Found->second->replaceFunction(NewFunc); |
| 482 } else { | 483 } else { |
| 483 AssociatedFctLoc = OldFunc; | 484 AssociatedFctLoc = OldFunc; |
| 484 } | 485 } |
| 485 scheduleInstructionsForCleanup(AssociatedFctLoc); | 486 scheduleInstructionsForCleanup(AssociatedFctLoc); |
| 486 return NewFT != OldFT; | 487 return NewFT != OldFT; |
| 487 } | 488 } |
| 488 | 489 |
| 489 bool SimplifyStructRegSignatures::runOnModule(Module &M) { | 490 bool SimplifyStructRegSignatures::runOnModule(Module &M) { |
| 490 bool Changed = false; | 491 bool Changed = false; |
| 491 | 492 |
| 492 const DataLayout *DL = M.getDataLayout(); | |
| 493 unsigned PreferredAlignment = 0; | 493 unsigned PreferredAlignment = 0; |
| 494 if (DL) | 494 PreferredAlignment = M.getDataLayout().getStackAlignment(); |
| 495 PreferredAlignment = DL->getStackAlignment(); | |
| 496 | 495 |
| 497 LLVMContext &Ctx = M.getContext(); | 496 LLVMContext &Ctx = M.getContext(); |
| 498 auto DISubprogramMap = makeSubprogramMap(M); | 497 auto DISubprogramMap = makeSubprogramMap(M); |
| 499 | 498 |
| 500 // Change function signatures and fix a changed function body by | 499 // Change function signatures and fix a changed function body by |
| 501 // wiring the new arguments. Call sites are unchanged at this point. | 500 // wiring the new arguments. Call sites are unchanged at this point. |
| 502 for (Module::iterator Iter = M.begin(), E = M.end(); Iter != E;) { | 501 for (Module::iterator Iter = M.begin(), E = M.end(); Iter != E;) { |
| 503 Function *Func = Iter++; | 502 Function *Func = Iter++; |
| 504 checkNoUnsupportedInstructions(Ctx, Func); | 503 checkNoUnsupportedInstructions(Ctx, Func); |
| 505 Changed |= simplifyFunction(Ctx, Func, DISubprogramMap); | 504 Changed |= simplifyFunction(Ctx, Func, DISubprogramMap); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 539 errs() << *Resume << '\n'; | 538 errs() << *Resume << '\n'; |
| 540 report_fatal_error( | 539 report_fatal_error( |
| 541 "Resumes with aggregate register signatures are not supported."); | 540 "Resumes with aggregate register signatures are not supported."); |
| 542 } | 541 } |
| 543 } | 542 } |
| 544 } | 543 } |
| 545 | 544 |
| 546 ModulePass *llvm::createSimplifyStructRegSignaturesPass() { | 545 ModulePass *llvm::createSimplifyStructRegSignaturesPass() { |
| 547 return new SimplifyStructRegSignatures(); | 546 return new SimplifyStructRegSignatures(); |
| 548 } | 547 } |
| OLD | NEW |